1

そこで、次のテストプロジェクトを作成しました。

[DllImportAttribute("TestMFCDLL.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern int test(int number);

private void button1_Click(object sender, EventArgs e)
{
    int x = test(5);
}

これは、関数テストが定義されているMFC dllで正常に機能しますが、実際に使用しているのは、すべて共通のエントリ関数を共有し、入力に基づいて異なる方法で実行される多くのMFCdllです。だから基本的に私はコンパイル時に名前が何であるかを知ることができないたくさんのdllを持っています、私はそれらがこのプログラムのセットアップ方法と同様の機能を持っていることを知っています、実行時の知識に基づいてdllをインポートする方法はありますか?これを行うだけでエラーが返されます。

static string myDLLName = "TestMFCDLL.dll";
[DllImportAttribute(myDLLName, CallingConvention = CallingConvention.Cdecl)]

属性の引数は、定数式、typeof式、または属性パラメータータイプの配列作成式である必要があります。

4

1 に答える 1

3

DLLを動的にロードし、DLL内の関数を使用する場合は、もう少し行う必要があります。まず、DLLを動的にロードする必要があります。そのためにLoadLibraryとFreeLibraryを使用できます。

[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllName);

[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);

次に、DLL内の関数のアドレスを取得し、それを呼び出す必要があります。

[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string functionName);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int Test(int number);

それをすべてまとめると:

IntPtr pLib = LoadLibrary(@"PathToYourDll.DLL");
IntPtr pAddress = GetProcAddress(pLib, "test");
Test test = (Test)Marshal.GetDelegateForFunctionPointer(pAddress, typeof(Test));
int iRresult = test(0);
bool bResult = FreeLibrary(pLib);
于 2013-01-31T14:50:01.417 に答える