C# 在C中动态替换DLL#

C# 在C中动态替换DLL#,c#,.net,dll,.net-assembly,appdomain,C#,.net,Dll,.net Assembly,Appdomain,我使用的是VCProjectEngine.dll,Visual Studio 2010和Visual Studio 2012有两个版本。 我想动态地替换DLL版本,我将卸载旧版本,然后加载新的DLL 我从中了解到,我无法卸载DLL,但可以卸载所有域。 因此,我尝试卸载该域: AppDomainSetup domaininfo = new AppDomainSetup(); domaininfo.ApplicationBase = System.Environment.CurrentDirecto

我使用的是
VCProjectEngine.dll
,Visual Studio 2010和
Visual Studio 2012有两个版本。
我想动态地替换
DLL
版本,我将卸载旧版本,然后加载新的
DLL

我从中了解到,我无法卸载
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"));
但是它没有帮助,
VisualStudio2012
不知道
VCProject
类型,因为旧版本不适合它


我的代码出了什么问题?或者可能有其他方法以编程方式替换
DLL

正如您所说,您不能卸载DLL-您可以卸载应用程序域

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


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

因此,我需要将
AppDomain.CurrentDomain.Load
替换为
domain.Load
?是。您需要跨域边界调用DLL。我如何调用DLL?我只想声明DLL中存在的静态接口类型,比如
VCProject pro=solution.Projects.Item(1).Object在DLL中创建类的实例。这就是我所说的“调用DLL”的意思。对该实例的所有访问都将跨越域边界。问题是,旧dll和新dll中都存在这些类型,并且调试器采用旧dll中出现的类,而不是新dll中出现的类。请注意,不应为此使用AppDomain.Load。看看这个关于如何在特定AppDomain中加载程序集的答案。