2011-02-10 6 views
8

私は物理的にアクセスできないC#DLLを正しく参照できますか? (私は実際にちょうどすべてのそれは依存関係だではない、DLLを持っている。)私は持っていないC#(管理対象)DLLをどのように使用できますか?

背景:

をターゲットコンピュータで、C:\FancyProgramにインストールされたプログラムと多くの相互依存のDLLファイルがあります。

ターゲットコンピューターに展開する単純なアプリケーションをC:\SimpleProgramに書き込む必要があります。

この単純なプログラムは、C:\FancyProgramのdllファイルの1つにいくつかの呼び出しを行う必要があります。それは.netで管理されたDLLです

私の開発マシンでは、私はではありませんFancyProgramのコピーを持っています。私はその1つのDLLファイルを持っていますが、私は多くの依存関係がありません。また、そのDLLをSimpleProgramにバンドルすることもできません。

私のSimpleProgramが正しい場所から実行時にDLLを正しくコンパイルしてロードするように、このDLLをVisual Studioプロジェクトで使用して参照する正しい方法は何ですか?

ありがとうございました

+2

管理対象(.NET)またはアンマネージドDLL? –

+0

管理対象です。 (更新しました。ありがとうございます) – nonot1

+0

C:\ SmpleProgramからC:\ FancyProgramからdllが読み込まれないため、管理されたケースでも正しい場所から問題が発生します。または、GAC-edの依存関係はありますか?シンボリックリンクがトリックを行う場合は試していません(ええ:http://weblogs.asp.net/israelio/archive/2011/01/10/how-to-overcome-the-clr-fusion-limitation.aspx) – rene

答えて

0

あなたはテストについて何をしますか? .dllがGACにあり、そのように(理想的には)またはを参照する必要があることを確認したと仮定すると、.dllはすべてのコンピュータで同じ場所にある必要があります。参照に.dllを追加し、ローカルコピー:falseとして、展開しないでください。がんばろう。

+0

テストはターゲットマシン上で行われます。 (これはコードのほんの一部です)。 DLLは、すべてのターゲットマシン上の正確に指定された場所にあります。実行時に特定の場所からロードするようにプログラムに指示するにはどうすればよいですか? – nonot1

+0

それを知って、私はzihotkiの提案と一緒に行くだろう。 – RobertG5

1

をあなたはLoadLibraryGetProcAddressMarshal.GetDelegateForFunctionPointerの詳細を確認したい場合があります。

外部DLLと同じインターフェイスを使用して、ローカルでテストするためのDLLも作成します。どのくらいの機能をそこに置くかは、インターフェイスの複雑さとあなたのSimpleProgramによって決まります。

私の古いquestionには、外部DLLのインポートに関する優れた回答がいくつかありました。

3

.Netはとにかくレイトバインディングを行います。実際にロードすることを意味するまで、どんな方法でも.dllを参照しない限り、これは動作します。

すべての参照(フィールド、プロパティ、メソッド、インスタンス)をspearateクラスまたはプロジェクトにカプセル化し、必要な場合にのみインスタンスを作成します。次に、ロードエラーを試行できます。 アプリケーションの実行時にVisual Studioの出力ウィンドウを表示すると、そのDLLがいつ読み込まれるのかがわかります。

また、あなたのアプリが優雅にエラーを処理するために、これらのイベントを見てみたいことがあります。

AppDomain.CurrentDomain.AssemblyLoad += ...; 
AppDomain.CurrentDomain.AssemblyResolve += ...; 
AppDomain.CurrentDomain.UnhandledException += ...; 
AppDomain.CurrentDomain.FirstChanceException += ...;

ます。またMEFアプローチを取ることができます。遅いロード/バインディングを行うためのフレームワークです。

関連する問題