11

dll を使用する C# アプリケーションがあります。アプリケーションを実行しようとすると、DLL が同じディレクトリまたは GAC にない限り、DLL を見つけることができません。同じディレクトリに置きたくないし、GAC にインストールしたくありません。ライブラリを探す場所をアプリケーションに伝える方法はありますか? (たとえば、アプリケーションを顧客に配布し、顧客が dll を使用する独自のアプリケーションを使用したい場合)。

追加した:

私はこのファイル構造を持ちたいです:

MainFolder: ライブラリ、アプリケーション

ライブラリ: lib.dll

アプリケーション: app1.exe

それをGACにコピーしたり、アプリケーションフォルダーにlib.dllを入れたりしたくありません。出来ますか?

4

7 に答える 7

8

顧客のアプリケーションは、使用する dll を独自のディレクトリにコピーすることをお勧めします。

VB6 は、アプリケーション間で dll を共有するために使用されます。これには、DLL Hellという用語があります。

于 2009-03-10T11:21:35.853 に答える
6

MSDN のこのガイドに従ってください: アセンブリの場所の指定

于 2009-03-10T11:18:10.197 に答える
4

あなたのメインで:

 AppDomain.CurrentDomain.AssemblyResolve += (s,e)=>{
    var filename = new AssemblyName(e.Name).Name;
    var path = string.format(@"C:\path\to\assembly\{0}.dll",  filename);
    return Assembly.LoadFrom(path);
 };

それにいくつかの例外処理を追加します

于 2009-03-10T11:39:30.927 に答える
1

GAC がなくても可能ですが、アセンブリには厳密な名前を付ける必要があり、バージョンまたは publickeytoken が変更されるたびに app.config を変更する必要があります。これは、\ にメイン プログラム、\Shared に共有ライブラリがあるものです。\SDK で分離したいサブプログラムは、アセンブリに ..\Shared を使用します。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="shared" />
      <dependentAssembly>
         <assemblyIdentity name="protobuf-net" publicKeyToken="257b51d87d2e4d67" />
         <codeBase version="1.0.0.282" href="../protobuf-net.dll"/>
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="SevenUpdate.Base" publicKeyToken="5d1aea1de74f122c" />
         <codeBase version="11.5.4.0" href="../SevenUpdate.Base.dll"/>
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="SharpBits.Base" publicKeyToken="5d1aea1de74f122c" />
         <codeBase version="11.5.5.0" href="../SharpBits.Base.dll"/>
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="System.Windows" publicKeyToken="5d1aea1de74f122c" />
         <codeBase version="11.5.5.0" href="../System.Windows.dll"/>
       </dependentAssembly>
       <dependentAssembly>
         <assemblyIdentity name="WPFLocalizeExtension" publicKeyToken="5d1aea1de74f122c" />
         <codeBase version="11.5.5.0" href="../WPFLocalizeExtension.dll"/>
       </dependentAssembly>
    </assemblyBinding>
  </runtime>
于 2011-05-06T06:48:37.123 に答える
1

以前の質問への回答で述べたように、DLL は GAC またはアプリケーションのディレクトリまたはサブディレクトリのいずれかに存在する必要があります。

顧客が DLL を使用して独自のアプリケーションを作成したい場合は、それを GAC にインストールするか、顧客に DLL もコピーしてもらう必要があります。ライブラリの複数のコピーを持つことは良いことのようには思えませんが、実際にはそうです。つまり、1 つのコピーを他のすべてを壊すことなく別のバージョンにアップグレードできるということです。

于 2009-03-10T11:22:44.773 に答える
0

ログに記録してから、フレームワークがアセンブリをロードしようとして実行したアクションを表示できます。これにより、アセンブリの負荷エラーの診断が非常に簡単になります。

両方を行うためのツールは「FUSLOGVW.exe」(FusionLog Viewer、Fusionはローダーの名前)であり、SDKに含まれています。

于 2009-03-10T11:31:10.323 に答える
0

あなたの前の質問に対する私の答えで言ったように:

app.config または machine.config でアセンブリ リダイレクトの手順を使用します。

于 2009-03-10T11:20:44.467 に答える