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

标签 c# .net .net-assembly appdomain

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

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

  • 需要根据请求应用权限和限制
  • 应在临时应用域中评估每个请求
  • 从临时域的路径加载所需的组合和引用类型

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

        // 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 中加载程序集,则不能在主域中调用 UnwrapUnwrap 也在那里加载类型。您必须将对对象的所有访问权限从临时程序集移动到临时 AppDomain。您可以使用 AppDomain.DoCallBack 或您在子域中实例化并从父域调用的自定义 MarshalByRef 类来执行此操作。

关于c# - 从另一个目录加载程序集到临时 Appdomain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23930397/

相关文章:

c# - Winforms 事件架构

c# - 在不同命名空间内的相同结构之间转换值。 C#

c# - 将对数据网格所做的更改反射(reflect)回数据集和数据表

c# - 为什么我必须链接引用程序集?

c# - 如何将加载的程序集提供给 C# 中的 Roslyn 工作区

C# 类库异常处理

c# - 在 TreeViewItem WPF 中设置 SelectionActive

c# - 值是枚举和 -1 吗?

c# - 使用 C# 将应用程序发送到特定屏幕

c# - 从相对路径加载c#中的dll