编程语言
首页 > 编程语言> > c# – 从另一个目录将程序集加载到临时Appdomain

c# – 从另一个目录将程序集加载到临时Appdomain

作者:互联网

作为BaaS项目的一部分,我需要从“guest”程序集动态执行代码.我已经尝试了其他类似问题的所有示例和答案,包括AppDomainToolKit方法,但没有运气.

与插件方法类似,我通过将相关程序集复制到主机应用程序的bin路径中获得了积极的结果.但是,对于当前场景,这是不可能的:

>每个请求都需要应用权限和限制
>应在临时appdomain中评估每个请求
>从路径到临时域加载所需的汇编和引用类型

到目前为止,我的最新一段代码如下

        // ClassLibrary1.dll and ClassLibrary2.dll are in the same directory, both are marked as Serializable

        var binPath =  @"C:\AssemblyDemo\ClassLibrary1\bin\Debug\";
        var lib1Path = binPath + "ClassLibrary1.dll";
        var lib2Path = binPath + "ClassLibrary2.dll";

        var setup = new AppDomainSetup();
        setup.ApplicationBase = binPath;
        AppDomain domain = AppDomain.CreateDomain("domainname", null, setup);
        ObjectHandle handle = domain.CreateInstanceFrom(lib1Path, "ClassLibrary1.Class1");
        var unwrap = handle.Unwrap();
        var m1 = unwrap.GetType().GetMethod("Method1");
        var result = m1.Invoke(unwrap, null);

handle.Unwrap()抛出异常未解析成员’ClassLibrary1.Class1,ClassLibrary1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null’.

解决方法:

如果只想在临时AppDomain中加载程序集,则无法在主域中调用Unwrap.解包也在那里加载类型.您必须将对象的所有访问权限从临时程序集移动到临时AppDomain.您可以使用AppDomain.DoCallBack或您在子域中实例化并从父域调用的自定义MarshalByRef类来执行此操作.

标签:c,net,net-assembly,appdomain
来源: https://codeday.me/bug/20190703/1364490.html