AppDomain ExecuteAssembly无法加载文件或程序集

时间:2012-01-06 19:07:29

标签: c# appdomain shadow-copy

我有一个应用程序(app1)加载另一个应用程序(app2),如下所示:

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";

2 个答案:

答案 0 :(得分:2)

请参阅此问题:How to add folder to assembly search path at runtime in .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>

答案 1 :(得分:1)

AppDomainSetup.ApplicationBase 。您可以通过此属性为应用程序域指定基本应用程序目录。 ApplicationBase本质上是程序集探测的起点。此外,您可以使用AppDomainSetup.PrivateBinPath指定其他专用bin路径。这允许探测搜索其他目录。 MSDN页面中有代码示例。