0

他の c# dll ライブラリを使用する dll c++/cli ライブラリを作成しました。C++/cli ライブラリは、それを呼び出すアプリケーションと同じフォルダーに c# dll がある場合に正常に動作します。このライブラリは最終的に多くのアプリケーションにロードされるため、C# dll をアプリケーションと共にディレクトリにコピーしてはなりません。c++/cli ライブラリと同じフォルダーに配置する必要がありますが、その場合、System.IO.FileNotFoundException が発生します。私の提案は、C# ライブラリを手動でロードするか、f.ex のパスを変更することです。Firefox は依存関係を探していますが、LoadLibrary() および Assembly::LoadFrom() メソッドを使用して、正しいディレクトリから強制的にロードしようとしました。もちろん、システム PATH に dll を含むディレクトリ パスを追加しました。私はVS2010で作業しています。

4

1 に答える 1

1

アプリケーションが dll を検索する既定のディレクトリは変更しません。

設計時に、DLL をよく知られた場所 (展開先の場所) に配置します。それへの参照を追加します。これが [Don't copy ever] に設定されていることを確認してください。そうしないと、最終的に bin フォルダーに入ります。そうしないと、コンパイルされません。

展開するときは、共通の dll を展開するためのパッケージと、アプリケーションごとに 1 つのパッケージが必要になります。AppB と比較して、appA が共通の dll の古いバージョンまたは新しいバージョンを必要とする場合は、独自のバージョンの dll 地獄を作成しないように注意してください。

メインに AppDomain.AssemblyResolve イベントを追加します (Windows アプリの場合)。実行時に、dll で型を参照するときにイベント ハンドラーが起動されますが、アセンブリはまだ読み込まれていません。

そこで、よく知られている場所からロードします。通常、構成または相対パスにあります。

E.g.
AllMyApps
  CommonDLLS
  MyFirstApp

したがって、必要な共通 dll をロードするパスは、"..\CommonDlls\MyCommondll.dll" になります。

NB 何らかの方法で dll を保護する必要があります。そうしないと、悪者が自分のバージョンの dll をアプリに挿入できる可能性があります。これは悪いことです...

このメカニズムを使用して、リモート サーバーまたはデータベース BLOB からも dll を取得できます。

最も単純なケースは、ほんの数行のコードで、イベントを調べるだけです。同様のシナリオでこれを実行するには、約 15 分かかりました。

ただし、このマシンにはありません。そうでなければ、コードに貼り付けていたでしょう。

于 2013-07-25T20:23:36.507 に答える