我有一个加载另一个应用程序(app2)的应用程序(app1),如下所示:
this._appDomain.ExecuteAssembly(assemblyName);
当那行执行时,我得到了这个错误:
无法加载文件或程序集Foo。。。
App2引用了Foo。如果我在app1中添加对Foo的引用,它就会起作用。问题是我不希望app1引用Foo。App1的主要目的是在网络共享上检测app2的新版本,卸载app2,复制新的二进制文件,然后使用上面的行再次启动app2。之后,如果app1中有旧的Foo,那么app2将在自己的运行目录中使用它而不是Foo。
我怎么能让app2只引用Foo,而app1仍然会加载app2而没有那个错误呢?
注意:我使用的是影子复制,当app1引用Foo时,它就可以工作了。
appDomainSetup.ShadowCopyFiles = "true";
看看这个SO问题:如何在.NET运行时将文件夹添加到程序集搜索路径?
或者,您可以在配置中添加<codebase>
标记,指定在哪里搜索程序集,并添加对app2依赖项的引用。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="MyAssembly2" culture="neutral" publicKeyToken="307041694a995978"/>
<codeBase version="1.0.1524.23149" href="FILE://C:/Myassemblies/MyAssembly2.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
请参阅AppDomainSetup.ApplicationBase。您可以通过此属性指定应用程序域的基本应用程序目录。ApplicationBase本质上是程序集探测的起点。此外,您可以使用AppDomainSetup.PrivateBinPath指定其他专用bin路径。这允许探测搜索其他目录。MSDN页面中有一些代码示例。