Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在应用中避免GAC_C#_.net_.net 4.0_.net Assembly_Gac - Fatal编程技术网

C# 在应用中避免GAC

C# 在应用中避免GAC,c#,.net,.net-4.0,.net-assembly,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

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

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)
我在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>

..\..\packages\Microsoft.Net.Http.2.0.20710.0\lib\net40\System.Net.Http.dll
对此

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

..\..\packages\Microsoft.Net.Http.2.0.20710.0\lib\net40\System.Net.Http.dll
我还尝试将其添加到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>

? 或者GAC是否使用名称空间等?嗯,我正在尝试……当我让有问题的人测试它时,我会报告它是否有效


有什么想法吗?

如果CLR确定GAC中存在足够好的匹配,则无法避免从GAC(*)加载程序集。本地副本的数量对您没有帮助

(*)您可以尝试甚至不能使用
LoadFrom
使用字节:

对于加载到LoadFrom上下文中的程序集,绑定器首先检查确切的程序集(相同的标识和位置)是否已存在于加载上下文中。如果是,它将丢弃LoadFrom上下文中的程序集信息,并使用Load上下文中的程序集信息

有关程序集加载的更多信息,请搜索


注意:在这种特殊情况下,解决方案可能会在GAC中检测到此恶意非RTM二进制文件(即,通过尝试进行准确调用并检查“缺少方法”异常),并显示带有解析步骤的消息,而不是试图绕过正常加载策略。

FYI,在我的计算机中找不到System.Net.Http.Headers.HttpHeaders.AddWithoutValidation(…)方法。但是,我确实看到System.Net.Http.Headers.HttpHeaders.TryAddWithoutValidation(…)

对我来说,似乎您有一个带有旧方法签名的非RTM版本的DLL(System.Net.Http.DLL)。由于大多数用户都没有安装,因此,.NET将使用本地副本,一切正常

出现问题的用户可能安装了RTM版本(可能与不同的软件包捆绑在一起)。在本例中,.NET将使用GAC版本,因为它是最新版本


我支持我在评论中的建议,清理非RTM库中的开发和构建计算机,重新编译和重新部署。

如果您引用的程序集是GAC中的程序集(具有相同的强名称,即版本号和公钥令牌)然后.Net framework将始终从GAC加载该程序集,除非该程序集已经加载

如果您有要加载的DLL副本,则该DLL需要使用不同的强名称(或不使用强名称),以便.Net framework可以判断GAC中的强名称是不同的,并且应该查看其他位置(例如,应用程序旁边)-从听起来,这将涉及以某种方式修改DLL的本地副本,例如

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


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

我使用ilmerge,将程序集合并到我的库中,并绕过它

基于,您似乎正在使用一种不再可用的方法。修复它的正确方法是使用RTM版本的库、重新编译和部署。Net 2.0可以运行针对.Net 3.5编译的代码(因为运行时是相同的),但是.Net 3.5引入了新的方法和类,您可以看到这里出现的错误。我会使用Assembly.Load big hammer方法使事情恢复正常,这样您就可以轻松地找到正确的方法。我应该提到,它在.net 4.0和带有.net 4.5的系统上运行良好,只是有些系统碰巧出于任何原因在GAC中包含这些文件。据我所知,它没有新的.net安装。@AdrianGodong Rtm版本?这是我检查的第一个堆栈溢出问题。这个软件可以在大多数机器上运行,由于某些原因,它只是一小部分,在它们的GAC中有这些文件。他们是网络上的标准用户,大多数没有开发或web开发的知识。我想某个软件供应商出于任何原因决定把它们放在那里。哎呀,没有办法绕过GAC。即使从原始字节加载,程序集标识也会被检查,如果它具有强名称且存在匹配项,则将从GAC加载。@mikez-你说得对,谢谢。我认为使用LoadFrom可能有效,但实际上不应该——我已经用文章的链接更新了答案。+1——如果可能的话,关于使用新的强名称的好建议(也对实际问题没有帮助)。注意:如果存在GAC one,您应该无法加载本地副本,显然,即使是
LoadFrom
——请参阅我在回答中刚刚链接的文章。该软件在大多数机器上都能工作,由于某些原因,在GAC中包含这些文件的数量很少。他们是网络上的标准用户,大多数没有开发或web开发的知识。我想某个软件供应商出于任何原因决定把它们放在那里。我正在部署正确的版本。我使用的版本是最新的稳定WebApi客户端库,于5月16日更新。我相信它说我认为你找错地方了。WebApi客户端库很好,问题似乎在于.NET框架本身。查看System.Net.Http.Headers.HttpHeaders类的最新文档。不再记录AddWithoutValidation()方法。如果您仍然在开发机器中看到它,您的.NET Framework可能已经过时。两个客户端的版本相同
    <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>