【问题标题】:AppDomain ExecuteAssembly Could not load file or assemblyAppDomain ExecuteAssembly 无法加载文件或程序集
【发布时间】:2012-01-06 19:07:29
【问题描述】:

我有一个应用程序 (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";

【问题讨论】:

  • 不,Foo 是我自己的 app2 需要的程序集。 Foo 会随着 app2 的发展而变化,我不希望 app1 运行文件夹中有陈旧的 Foo。
  • 我的错误 - 我的意思是:将 Foo 嵌入到 app2 中,这样可以解决问题,而无需在运行文件夹中的任何位置将 Foo 作为单独的文件,因此 Foo 永远不会过时......
  • 啊,有道理,但我也做不到。其他项目参考 Foo。我认为下面 Mikael 提供的链接会起作用。

标签: c# appdomain shadow-copy


【解决方案1】:

看到这个问题: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>

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 成功了!简单易行:appDomainSetup.ApplicationBase = this._runningAppPath;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多