c# - 在C#中动态替换DLL

标签 c# .net dll .net-assembly appdomain

我使用VCProjectEngine.dllVisual Studio 2010Visual Studio 2012有2个版本。 我想动态替换DLL版本,我会卸载旧版本,然后加载新的DLL

我从this post了解到我无法卸载DLL,但可以卸载所有。 所以我尝试卸载域:

AppDomainSetup domaininfo = new AppDomainSetup();
domaininfo.ApplicationBase = System.Environment.CurrentDirectory;
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, domaininfo);

AppDomain.Unload(domain);

现在我尝试加载新的 DLL 版本:

AppDomain.CurrentDomain.Load(new AssemblyName("Microsoft.VisualStudio.VCProjectEngine, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"));

但这没有帮助,Visual Studio 2012 不知道 VCProject 类型,因为旧版本对此不正确。

我的代码有什么问题吗?或者也许还有其他方法可以以编程方式替换DLL

最佳答案

正如您所说,您无法卸载 DLL - 您可以卸载应用程序域。

但是,为了使卸载应用程序域正常工作,您需要在要卸载的域中加载 DLL。在您的示例中,您要卸载一些应用程序域,然后在应用程序的默认域中加载 DLL。

您应该在该域中加载 DLL,并在那里调用它的方法。请注意,您需要所有返回值和参数都是可序列化的,因为它们将被编码(marshal)。这也意味着 DLL 公开的对象应该是 MarshalByRef 对象。

关于c# - 在C#中动态替换DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21073874/

相关文章:

c# - 依赖注入(inject)作用域为 Transient,然后 Transient 为 Singleton

c# - 添加解决方案名称作为所有项目的命名空间的基础

c# - 处理 Prism 4 模块中的异常

c# - 在MVC中读取excel文件数据

c# - 事件查看器中的行号

c# - 在不知道 sqlDbType 的情况下将 DBNull.Value 与 SqlParameter 一起使用?

c++ 一个解决方案两个项目(exe & dll)链接错误

c++ - 为什么dll不能在c++中使用?

c# - AutoResetEvent 和 ManualResetEvent 之间的混合

c++ - 在应用程序运行时编译.dll