在C#中动态替换DLL

时间:2014-01-12 11:03:39

标签: 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

1 个答案:

答案 0 :(得分:2)

正如您所说,您无法卸载DLL - 您可以卸载app-domains。

但是,要卸载app-domains,您需要在要卸载的域中加载DLL 。在您的示例中,您正在卸载某个应用程序域,然后在应用程序的默认域中加载DLL。

您应该在该域中加载DLL,并在那里调用其方法。请注意,您需要将所有返回值和参数都序列化,因为它们将被封送。这也意味着DLL暴露的对象应该是MarshalByRef个对象。