3

C# アプリケーションで使用したい MFC 拡張 DLL があります。私が公開している関数は C 関数です。つまり、このようにエクスポートしています。

extern "C"
{
 __declspec(dllexport) bool Initialize();
}

関数は内部で MFC クラスを使用するため、P/Invoke を使用して C# で DLL を使用するにはどうすればよいですか。

次に、関数のオーバーロードを使用したいのですが、私が知る限り、C は関数のオーバーロードをサポートしておらず、C++ 関数をエクスポートすると、関数がマングルされます。では、この問題を解決するにはどうすればよいでしょうか。DllImportを使用して、C++ マングル関数をインポートできますか。

4

2 に答える 2

10

ヘッダーに次の宣言があります。

__declspec(dllexport) int fnunmanaged(void);
__declspec(dllexport) int fnunmanaged(int);

関数の正確な名前を取得するには、dumpbin.exeを使用できます。

dumpbin.exe /exports unmanaged.dll

Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file unmanaged.dll

File Type: DLL

  Section contains the following exports for unmanaged.dll

    00000000 characteristics
    4B0546C3 time date stamp Thu Nov 19 14:23:15 2009
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 0001106E ?fnunmanaged@@YAHH@Z = @ILT+105(?fnunmanaged@@YAHH@Z)
          2    1 00011159 ?fnunmanaged@@YAHXZ = @ILT+340(?fnunmanaged@@YAHXZ)

  Summary

        1000 .data
        1000 .idata
        2000 .rdata
        1000 .reloc
        1000 .rsrc
        4000 .text
       10000 .textbss

関数を宣言するときは、この名前を使用します。

[DllImport(@"D:\work\unmanaged.dll",
    EntryPoint = "?fnunmanaged@@YAHH@Z",
    ExactSpelling = true)]
static extern int fnunmanaged();

[DllImport(@"D:\work\unmanaged.dll",
    EntryPoint = "?fnunmanaged@@YAHXZ",
    ExactSpelling = true)]
static extern int fnunmanaged(int a);

もう 1 つの方法は、モジュール定義ファイルを使用することです。

LIBRARY "unmanaged"
EXPORTS 
  fn1=?fnunmanaged@@YAHH@Z
  fn2=?fnunmanaged@@YAHXZ

この場合、使用する必要がなくなり__declspec(dllexport)、ヘッダー ファイルは次のようになります。

int fnunmanaged(void);
int fnunmanaged(int);

そして最後にそれらをインポートします:

[DllImport(@"D:\work\unmanaged.dll")]
static extern int fn1();

[DllImport(@"D:\work\unmanaged.dll")]
static extern int fn2(int a);
于 2009-11-19T13:28:00.840 に答える
2

MFC 拡張 DLL は、呼び出し元で CWinApp オブジェクトを想定しています。C# にはありません。CWinApp オブジェクトを持つ MFC 通常の DLL を使用して DLL をラップします。

于 2009-11-19T17:16:22.507 に答える