(This is the rewrite of my post to comp.lang.tcl. I thought it was a not good place to post this kind of a question.)
Is it possible for a starpack-wrapped Tcl/Tk application to use external .NET assemblies using Garuda? I use the latest build (1.0.7900.33333, 2021-08-23).
My Tcl/Tk application is wrapped into a starpack with ActiveState TclApp. I wanted to check if Garuda can work with my app.
Ideally, I want to embed Eagle.dll and Garuda.dll into my starpack but at first, I just installed Eagle/Garuda binaries to the lib folder under the working directory and inserted the path to the head of ::auto_path.
The purpose to use Garuda is to load an external managed assembly from the local sub-folder. The assembly is dependent on several DLLs in the same folder. I keep them out of my starpack.
```
+ lib\
+ Garuda-1.0\
+ dotnet.tcl
+ Eagle.dll
+ Garuda.dll
+ helper.tcl
+ pkgIndex.tcl
+ GRPCRemoteClient\
+ Google.Protobuf.dll
+ Grpc.Core.Api.dll
+ Grpc.Core.dll
+ grcp_csharp_ext.x86.dll
+ GRPCRemoteClient.dll (This is the DLL to be loaded from MyApp.tcl)
+ System.Buffers.dll
+ System.Memory.dll
+ System.Numerics.Vectors.dll
+ System.Runtime.CompilerServices.Unsafe.dll
+ MyApp.exe (MyApp.tcl wrapped into exe.)
```
**MyApp.tcl** is the main script. It loads Garuda.
The eagle command loads **GRPCRemoteClient/GRPCRemoteClient.dll** and the classes and the methods are used. The other DLLs in **GRPCRemoteClient** folder are loaded by **GRPCRemoteClient.dll**.
If **MyApp.tcl** is not wrapped into a starkit, it works well.
However, if it is wrapped, it can't create any instance of classes defined inside **GRPCRemoteClient.dll**, although it seemed to load **GRPCRemoteClient.dll** successfully.
I followed the instruction in this article and added **METHOD_PROTOCOL_V1R2** flag before loading Garuda package.
[](https://wiki.tcl-lang.org/page/Garuda)
```
# MyApp.tcl
set exehome [pwd]
set auto_path [linsert $auto_path 0 [file join $::exehome lib]]
namespace eval ::Garuda {
variable methodFlags 0x40; # METHOD_PROTOCOL_V1R2
}
package require Garuda
eagle {
object invoke System.Reflection.Assembly LoadFrom ./GRPCRemoteClient/GRPCRemoteClient.dll
}
# => {GRPCRemoteClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null} c199bf34-6a72-4256-8e1c-5857959232ad 293
# => Seemed successful.
eagle {
object create -alias GRPCRemote.GRPCRemoteClient "127.0.0.1" 50051
}
# => {type "GRPCRemote.GRPCRemoteClient" not found} {expected type value but got "GRPCRemote.GRPCRemoteClient"}
# => Failed.
```