2010-02-22 131 views
1

我在动态加载.dlls,我想从我的.exe所在的 子目录中加载它们。AppDomain.CurrentDomain.AppendPrivatePath(“myPath”);备择方案?

要达到这样的Assembly.Load("SomeAssembly");其中SomeAssembly.dll位于下“的DLL \”,我已经做了

AppDomain.CurrentDomain.AppendPrivatePath("DLLs"); 

这工作得很好,但显然AppendPrivatePath已被弃用。 有人告诉我它是什么代替放置这在我的app.config

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="DLLs"/> 
    </assemblyBinding> 
    </runtime> 

然而,这没有任何影响。 Assembly.Load("SomeAssembly")将抛出一个例外,即SomeAssembly找不到。那么我如何才能做到这一点?

我可以ofcourse:

  • 继续使用AppDomain.CurrentDomain.AppendPrivatePath("DLLs");,即使它否决。在同一目录中的.exe
  • 将所有我的插件.DLL文件(MEH ...)
+1

探测元素应该工作,你确定你为可执行文件(即YourExecutable.exe.config)创建了一个app.config文件,而不是在一个DLL文件(即YourDll.dll.config)上? – 2010-02-22 15:43:55

回答

2

可以使用手工组装的分辨率做到这一点。

您需要提供一个代表对AssemblyResolve事件在当前的AppDomain

AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.AssemblyResolve += assemblyResolver.ResolveEventHandler; 

当应用程序有它无法解决它会调用该委托得到解决大会的任何组件引用。然后,您可以简单地返回从代表要求大会:

Assembly assembly = Assembly.LoadFrom (assemblyPath); 
return assembly; 

希望这有助于

1

没有,<probing>元素是众所周知的工作。在调试器中运行代码时,您可能会发现这不起作用。这是因为“Visual Studio托管流程”,这是CLR的自定义版本,它改进了调试。

将yourapp.exe.config复制到yourapp.vshost.exe.config。或者禁用主机进程:Project + Properties,Debugging选项卡。