c# - 避免在应用程序中使用 GAC

标签 c# .net .net-4.0 .net-assembly gac

<分区>

所以我有一些用户遇到这个错误

System.MissingMethodException: Method not found: 'Void System.Net.Http.Headers.HttpHeaders.AddWithoutValidation(System.String, System.Collections.Generic.IEnumerable`1<System.String>)'.
   at System.Net.Http.HttpHeaderExtensions.CopyTo(HttpContentHeaders fromHeaders, HttpContentHeaders toHeaders)
   at System.Net.Http.ObjectContent..ctor(Type type, HttpContent content)
   at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content)
   at Octgn.Site.Api.ApiClient.Login(String username, String password)

我无法在本地重现此错误,但一些使用我的 WPF 应用程序的人最终会遇到此错误。在对日志进行一些挖掘之后,我看到了这一点

LOADED ASSEMBLY: System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Net.Http\v4.0_2.0.0.0__b03f5f7f11d50a3a\System.Net.Http.dll

我已经尝试在 csproj 中更改它

<Reference Include="System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>..\..\packages\Microsoft.Net.Http.2.0.20710.0\lib\net40\System.Net.Http.dll</HintPath>
</Reference>

对此

<Reference Include="System.Net.Http">
  <HintPath>..\..\packages\Microsoft.Net.Http.2.0.20710.0\lib\net40\System.Net.Http.dll</HintPath>
</Reference>

我也试过将它添加到 app.config 文件中

    <dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="1.0.0.0 - 4.0.0.0" newVersion="2.0.0.0"/>
    </dependentAssembly>

这些东西似乎都不想加载与我的项目的 exe 位于同一目录中的 dll。我在本地有 dll,但似乎无法避开 GAC。这是一个每天有数百人使用的产品,所以我希望找到一些不需要用户最后在他们的机器上手动执行某些操作的解决方案。

我也考虑过使用 Assembly.Load 或类似的东西在加载时抢先加载代码中的 dll,但我不确定这是否会产生影响,我认为会有更优雅的解决方案。

好的,那么如果我使用 ilmerge http://www.microsoft.com/en-us/download/details.aspx?id=17630 将所有这些新程序集合并到一个新程序集中呢? ?或者 GAC 是否使用 namespace 等?好吧,我正在尝试...当我让遇到问题的人对其进行测试时,我会报告它是否有效。

有什么想法吗?

最佳答案

如果您引用的程序集是 strongly named并且该程序集位于 GAC 中(具有相同的强名称,即版本号和公钥 token ),那么 .Net 框架将始终从 GAC 加载该程序集,除非该程序集已经加载.

如果您有要加载的那个 DLL 的副本,那么该 DLL 需要具有不同的强名称(或没有强名称),以便 .Net 框架可以告诉GAC 中的一个是不同的,它应该在其他地方查找(例如,在您的应用程序旁边)- 从事情的声音来看,这将涉及以某种方式修改该 DLL 的本地副本,例如remove the strong name .

一旦两个 dll 具有不同的强名称(或本地名称不是强名称),使用绑定(bind)重定向应该可以正常工作。

更新:或者您可以尝试显式加载该程序集的本地副本(例如使用 Assembly.Load )在 .Net 框架加载该程序集之前,在这种情况下.Net 框架可能使用已经加载的框架而不是查看 GAC。 (未经测试)

关于c# - 避免在应用程序中使用 GAC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17438634/

相关文章:

c# - Entity Framework 核心——脚手架枚举

c# - Entity Framework 5 : Get Auto_Increment value before insert

C# 将对象写入二进制文件

c# - FormClosing 需要新线程吗?

.net - 在 MonoTouch 上即时转换 MPEG 文件

c# - .NET中如何使用反射判断和检查程序集中的类型是Custom类型还是Primitive类型?

c# - 你能在 C# 中包含 C++ 片段吗?

c# - 查看线程是否已启动?

c# - 如何将包含括号的字符串拆分为多维数组

c# - Azure CloudTable.ExecuteBatch(TableBatchOperation) 引发存储异常。如何找到导致异常的操作?