在appdomain中加载静态类

2023-12-07

我在 C# AppDomain 中遇到了一个大问题。

我需要在 .dll 文件中加载静态类并执行其方法:

  1. 当我尝试通过以下方式加载它们时

    Assembly.LoadFrom("XXXXX") // (XXXXX is the full path of dll)
    

    .dll 不会自动或以编程方式卸载。

  2. 当我尝试将它们加载到 AppDomain 中时

    adapterDomain = AppDomain.CreateDomain("AdapterDomain");
    (a)adapterDomain.CreateInstanceFrom(this.AdapterFilePath, this.AdapterFullName);
    (b)adapterAssembly=adapterDomain.Load(AssemblyName.GetAssemblyName(this.AdapterFilePath));
    

    如果我使用方法(a),因为目标类是静态类,所以不起作用。

    如果我使用方法(b),因为目标.dll与我的项目不在同一目录,我会得到一个异常。

如何加载 .dll 和静态类,然后在使用后卸载 .dll?


方法 (b) 失败是因为应用程序域.加载无法解析不在基本应用程序目录、探测专用路径或 GAC 中的程序集。

另请注意,AppDomain.Load is not在特定的 AppDomain 上加载程序集(例如adapterDomain.Load在您的示例代码中)。相反,它会将其加载到当前的 AppDomain 上(这是调用AppDomain.Load。此行为已在MSDN 文档.)显然这不是您正在寻找的。

以下是如何在子 AppDomain 中调用静态方法的示例:

class Program
{
    static void Main(string[] args)
    {
        // This is for testing purposes!
        var loadedAssembliesBefore = AppDomain.CurrentDomain.GetAssemblies();

        var domain = AppDomain.CreateDomain("ChildDomain");                        
        // This will make the call to the static method in the dhild AppDomain.
        domain.DoCallBack(LoadAssemblyAndCallStaticMethod);
        // Print the loaded assemblies on the child AppDomain. This is for testing purposes!
        domain.DoCallBack(PrintLoadedAssemblies);
        AppDomain.Unload(domain);

        // This is for testing purposes!
        var loadedAssembliesAfter = AppDomain.CurrentDomain.GetAssemblies();
        // Assert that no assembly was leaked to the main AppDomain.
        Debug.Assert(!loadedAssembliesBefore.Except(loadedAssembliesAfter).Any());

        Console.ReadKey();
    }

    // Loads StaticMethodInHere.dll to the current AppDomain and calls static method 
    // StaticClass.DoSomething.  
    static void LoadAssemblyAndCallStaticMethod()
    {
        var assembly = Assembly.LoadFrom(@"PATH_TO_ASSEMBLY");

        assembly.GetType("CLASS_CONTAINING_STATIC_METHOD")
                .InvokeMember("STATIC_METHOD", 
                              BindingFlags.Public | 
                              BindingFlags.Static | 
                              BindingFlags.InvokeMethod, 
                              null, 
                              null, 
                              null);
    }

    // Prints the loaded assebmlies in the current AppDomain. For testing purposes.
    static void PrintLoadedAssemblies()
    {
        Console.WriteLine("/ Assemblies in {0} -------------------------------",
                          AppDomain.CurrentDomain.FriendlyName);

        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            Console.WriteLine(assembly.FullName);
        }            
    }
}

为了使这项工作有效,您需要替换:

  • PATH_TO_ASSEMBLY 为包含静态方法(包括扩展)的程序集的路径。
  • CLASS_CONTAINING_STATIC_METHOD 是包含静态方法的类的名称,包括该类的命名空间。
  • STATIC_METHOD 带有静态方法的名称。

请注意,BindingFlags为公共静态方法设置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在appdomain中加载静态类 的相关文章

  • IIS应用程序池回收+quartz调度

    我正在 IIS 7 5 上运行一个 Web 应用程序 它需要偶尔回收 否则内存使用情况会失控 这是我正在研究的问题 当它回收时 它实际上不会运行 直到另一个请求到来 而quartz不会运行 有没有办法让IIS在回收应用程序池后立即自动启动1
  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • std::call_once 可重入且线程安全吗?

    std call once http en cppreference com w cpp thread call once是线程安全的 但它也是可重入的吗 我使用 VS2012 调试和发布 进行的测试表明 调用std call once从单
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • MySQL IFNULL“N/A”产生“在集合中找不到项目”错误

    我一直在使用 ISNULL 函数在 mySQL 查询中将 NULL 值转换为零 如下所示 SELECT IFNULL mem comment count 0 FROM members 这很好用 我现在尝试使用 IFNULL 函数将 NULL
  • 使用 Python gtk3 在 X 上进行全局键绑定

    我正在寻找一些可以与 gtk3 一起使用的 python xlib 全局键绑定示例 就像为 gtk2 所做的那样http www siafoo net snippet 239 这里的代码非常相似 from Xlib display impo
  • 如何添加NodeJs、S3、heroku直接上传到android?

    我试图了解如何将他们提供示例的方式从网站转换为 android retrofit 这是该网站的代码示例 function get signed request file var xhr new XMLHttpRequest xhr open
  • 多个子进程在同一管道上读/写

    我目前正在Linux环境中使用C语言学习套接字编程 作为一个项目 我试图编写一个基本的聊天服务器和客户端 目的是让服务器为每个连接的客户端分叉一个进程 我遇到的问题是读取一个孩子的数据并将其写入所有连接的客户端 我尝试通过在子级中循环调用
  • 是否可以在 ES6 Set 实例上使用数组迭代方法?

    我正在使用 ES6 Set 实例 我需要对它们应用一些转换 如果它们是数组的话 这些转换就会很简单 这是一个例子 let s new Set s add 1 s add 2 s add 3 let n s filter val gt val
  • 求和常量时的隐式缩小与求和变量时的显式缩小

    我写了一个程序 class First public static void main String args int c 5 byte b c 6 System out println b 我的 javac 输出是 error incom
  • 将一行转置为多行 Oracle

    我有一个总是返回一行的查询many列 我想把它变成 2 列和许多行 原始结果 Col1 Col2 Col3 Col4 val1 val2 val3 val4 我想要的是 ColName Value Col1 val1 Col2 val2 C
  • 了解 Chrome 网络日志“停滞”状态

    我在 Chrome 中有以下网络登录 我不明白其中的一件事 填充的灰色条和透明的灰色条有什么区别 谷歌对这些字段进行了细分评估网络性能他们的 DevTools 文档的部分 摘自资源网络时序 停滞 阻塞 请求在发送之前等待所花费的时间 该时间
  • 为什么不调用成员变量的移动构造函数?

    考虑以下课程 如果我自己实现移动构造函数如下 为什么是 bar 成员b不是移动而是复制 但如果我使用默认的移动构造函数 那么b被感动了 为什么b rhs b 不打电话bar bar 我使用 g 9 2 1 和 std c 11 class
  • jQuery滚动显示隐藏内容

    如何使默认情况下页面上显示 6 个 div 元素 并且当用户滚动到页面底部时 再加载 6 个元素 如果你看到这个example 它有多个div 我希望最初只显示其中 6 个 每次用户到达页面底部时 我希望再加载 6 个 直到您 用完 div
  • 使用什么语法从 JavaDB 数据库中选择常量字段值?

    我在用着UNION ALL结合几个结果SELECT查询成一ResultSet 我使用常量字段值来标识哪条语句生成了每一行 这适用于 MySQL 但 Java DB 会抛出异常SQLSyntaxErrorException 指向第一个常量字段
  • Mac OSx 10.8 上 IDLE (Python 3.3.2) 中的 NumPy

    我知道这可能是一个重复的问题 但我在这里找到的所有答案都超出了我的想象 我对 Python 很陌生 但我想在 IDLE 中使用 NumPy python 3 3 2 IDLE 似乎无法访问 OSX 10 8 即 python 2 7 附带的
  • 按关键字对数组中的元素进行分组

    我正在 AngularJS 1 上开发一个应用程序 但我不知道如何按项目拆分另一个数组中的项目数组 我的意思是我有一系列不同的项目 我会按 uuid 对项目进行分组 如下所示 name toto uuid 1111 name tata uu
  • 做 {...} while(false)

    我正在查看一个人的一些代码 注意到他的函数中似乎有一个模式
  • 可以使用“new”位置来更改“const”数据吗?

    这是后续memcpy 可以用来更改 const 成员数据吗 And 声明 C 不可变类的惯用方式真正解决这个问题 尤其是this回答 在围绕不可变数据设计的语言中 它知道它可以 移动 您的数据 尽管它具有 逻辑 不变性 Given a st
  • 如何在 AutoFixture 中设置更复杂(类似 IoC)的注册

    使用 AutoFixture 时 是否可以在集成测试中重用生产 IoC 容器注册 问题是 如果未注册依赖项并注入 真实 数据库相关依赖项 我需要以下固定装置设置来注入模拟 var fixture new Fixture WithMocks
  • 使用 JavaFX 将渐变应用于球体对象

    我正在 JavaFX 中工作 我正在尝试将渐变应用于球体 但是 显然 我不知道该怎么做 我被困住了 因为我知道球体是一个对象 所以它需要有一种材质 但是 就颜色而言 PhongMaterial 只采用一种颜色 所以它不会采用渐变 因为渐变是
  • pyQt Matplotlib 小部件实时数据更新

    使用 pyQt 4 8 5 在 Python 2 7 中编写 如何在 pyQt 中实时更新 Matplotlib 小部件 目前 我正在对数据进行采样 现在是 random gauss 附加此数据并进行绘图 您可以看到我每次都会清除该数字并为
  • 将具有多个键的字典按一个键求和的最有效方法是什么?

    我有以下字典结构 product1 product tmpl id product id qty product uom qty price price unit subtotal price subtotal total price to
  • 在appdomain中加载静态类

    我在 C AppDomain 中遇到了一个大问题 我需要在 dll 文件中加载静态类并执行其方法 当我尝试通过以下方式加载它们时 Assembly LoadFrom XXXXX XXXXX is the full path of dll d