c# - 找不到从我的 Windows 服务中删除/重新启动内存中的 DLL 状态的方法

标签 c# dll .net-4.0

我正在使用第 3 方 DLL,它在文件首次使用时从文件中读取,但从不检查文件是否有更改。我的想法是将 DLL 加载到 AppDomain 中,并在我进行第一次调用后卸载 DLL - 因此我会在每次调用时(或多或少)清除 DLL 的状态。

AssemblyName name = AssemblyName.GetAssemblyName(@"C:\fake.dll");
AppDomain newDomain = AppDomain.CreateDomain("DomainName");
Assembly lib = newDomain.Load(name);

...
//Use the Assembly

AppDomain.Unload(newDomain);

此代码块每秒可运行多次 - 效率低下,但这是我目前使用此 DLL 的唯一选择...

问题是 DLL 的内存似乎甚至存在于我创建的其他 AppDomain 中 - 它仍然使用它第一次读取文件时找到的相同值(并且它再也不会检查)。让 DLL 再次读取文件的唯一方法是重新启动服务。

我是不了解 AppDomain 还是应该从不同的角度来解决这个问题?

编辑:将 DLL 加载到我自己的域中的问题已使用 MarshalByRefObject 类解决(谢谢!),但我不希望它是跨域的。我希望这个 DLL 在这个 AppDomain 中生存和死亡 - Unload 方法是否足以粉碎这个 DLL 状态出现在另一个 AppDomain 中的任何希望?

最佳答案

如果您在“//使用程序集”代码中直接使用 dll 中的对象,那么您已将 dll 拉入当前 AppDomain 以及新 AppDomain 中。这意味着您还没有真正实现目标。

您需要使用反射来使用加载到新 AppDomain 中的类和方法,而无需将 dll 拉入原始 AppDomain。

关于c# - 找不到从我的 Windows 服务中删除/重新启动内存中的 DLL 状态的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8219000/

相关文章:

c# - 如何通过动态 lambda 和 IL 创建对象的新实例?

c# - 常量不能标记为静态

c# - 使用自定义货币代码格式化货币(ASP.NET Core MVC)

c# - 将数据发布到 HTTPS URL 时,GetRequestStream() 抛出超时异常

.NET 4 GC 触发收集的已知阈值?

c# - 在返回 float 的方法中将结果转换为 float 会改变结果

c# - 如何强制我的 C# Windows 窗体使用阿拉伯数字?

c++ - 为什么导出的函数在 DLL 中没有正确命名?

c# - 我可以将 C DLL 的输出重定向到我的 c# log4net 输出吗

c# - DLL 中的 DoEvents