2

したがって、このエラーが発生するユーザーがいます

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を回避するためにそれを取得できないようです。これは製品であるため、1 日に何百人もの人々に配布されます。そのため、ユーザーが最後に自分のマシンで手動で何かを行う必要のない解決策を見つけたいと考えています。

また、ロード時にコード内のdllをプリエンプティブにロードすることについても考えましたAssembly.Loadが、それが違いを生むかどうかはわかりません。よりエレガントなソリューションがあると思います。

ilmerge では、 http://www.microsoft.com/en-us/download/details.aspx ? id= 17630 を使用して、これらの新しいアセンブリをすべて新しいアセンブリにマージするとどうなるでしょうか。または、GAC は名前空間などを使用しますか? まあ、私はそれを試しています...問題を抱えている人にテストしてもらったら、うまくいったかどうかを報告します.

何か案は?

4

4 に答える 4

2

厳密な名前が付けられたアセンブリを参照しており、そのアセンブリが GAC にある (同じ厳密な名前、つまりバージョン番号と公開キー トークンを持つ) 場合、.Net フレームワークはそのアセンブリに.すでにロードされています。

代わりにロードしたい DLL のコピーがある場合、その DLLには別の厳密な名前を付ける (または厳密な名前を付けない)必要があります。これにより、.Net フレームワークは、GAC 内の名前が異なり、それが必要であることを認識できます。別の場所を見てください (たとえば、アプリケーションと一緒に) - 物事の音から、これにはその DLL のローカル コピーを何らかの方法で変更することが含まれます。たとえば、厳密な名前を削除します。

2 つの dll の厳密な名前が異なる (またはローカルの dll に厳密な名前が付けられていない) と、バインド リダイレクトを使用して正しく動作するはずです。

更新:または、.Net フレームワークがそのアセンブリを読み込む、そのアセンブリのローカル コピーを明示的に読み込むこともできます (例: Assembly.Loadを使用) 。(未テスト)

于 2013-07-03T16:45:13.347 に答える
1

私はilmergeを使用し、アセンブリをライブラリにマージして回避しました。

于 2013-07-05T07:10:43.790 に答える