2016-04-12 16 views
0

まず、私の状況を説明します。私は私にブラックボックスであるDLLライブラリを持っています。私はどの言語が書かれたのかは分かりません。私の推測それはC + +またはCでも、しかし、私は知らない。しかし、私はそれを使用する方法を知っているDLL関数を知っています。C#静的および動的にDLLをリンクする

ビジネスにまっすぐに。上記のDLLで動作するアプリケーションC#.NETを作成しています。私はすべての方法をリンクして私に知ってみましたが、1つだけが動作します:

  • スタティック:[DllImport("myDll.dll")] - それは動作します。
  • 動的:Kernel32.dll LoadLibrary/FreeLibrary - コード126 - The specified module could not be foundで例外が発生しています。その問題は、依存性の欠如にある。
  • Dynamic:Reflectionによって - Assembly.LoadFile(aPathFileName)を使用している場合、例外が発生しています:The module was expected to contain an assembly manifest

私の問題は、私が実際に設定ファイルのいくつかの種類のブラックボックスdllにパスを指定する必要があるということです。私は今何をすることができますどのようなヒント、この問題を解決することができます頼むことができますか?より具体的には:設定ファイルから文字列をロードし、それを静的リンクDllImport(const string path)に必要な定数文字列を埋めるために使用する方法はありますか?または私が知らないDLLをダイナミックリンクする別の方法がありますか?

EDIT別の質問が重複する可能性に

回答:私は使用することはできませんメソッドにその質問参照の両方の答え。私が言ったように、私はLoadLibrary関数(例外126)を使用することはできませんし、また、私はハードコーディング可能なパスの戦利品を指定することはできません

+0

この他の投稿が有効です。私はkernel32.dll SetDllDirectoryを呼び出すことができ、静的なDllImportによってリンクされた私のブラックボックスdllのメソッドを呼び出す前に、設定ファイルからのパスでそれを記入することができます!私はそれを試し、適切な答えを投稿します。 – user1916778

答えて

0

Sinatrはthis質問へのリンクを掲載(私は、configファイルからのロードパスを必要と述べました)コーディ・グレイは面白い解決策を出しました。 DLLへの静的DllImportターゲットパスは、kernel32.dll SetDllDirectoryによって上書きできます。私が行うために必要なすべては、このカーネル関数に

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
static extern bool SetDllDirectory(string lpPathName); 

を起動して、ターゲットのDLL関数の最初の使用の前に私の設定ファイルに保存されたパスでそれを埋めるでした。 (:\フォルダ\ name.dllのようなC)、DLLの名前ではない完全なパス:対象のDLLが(\フォルダCのように)存在する場合

SetDllDirectory(Settings.Default.dllPath); 

重要なのは、フォルダへの唯一のパスSetDllDirectoryのために設定することです。

関連する問題