2

C#でWin32dllメソッドを使用するためにDLLImportを使用しようとしています。

Win32 dll C ++//.hファイル

#ifdef IMPORTDLL_EXPORTS
#define IMPORTDLL_API __declspec(dllexport)
#else
#define IMPORTDLL_API __declspec(dllimport)
#endif

// This class is exported from the ImportDLL.dll
class IMPORTDLL_API CImportDLL {
public:
    CImportDLL(void);
    // TODO: add your methods here.
    int Add(int a , int b);
};

extern IMPORTDLL_API int nImportDLL;

IMPORTDLL_API int fnImportDLL(void);
IMPORTDLL_API int fnMultiply(int a,int b);

//.cppファイル

// ImportDLL.cpp:DLLアプリケーションのエクスポートされた関数を定義します。//

#include "stdafx.h"
#include "ImportDLL.h"


// This is an example of an exported variable
IMPORTDLL_API int nImportDLL=0;

// This is an example of an exported function.
IMPORTDLL_API int fnImportDLL(void)
{
    return 42;
}

IMPORTDLL_API int fnMultiply(int a , int b)
{
    return (a*b);
}

これをビルドすると、ImportDLL.dllを取得します

次に、Windowsアプリケーションを作成し、このdllをデバッグフォルダーに追加して、DLLImportを使用してこのメ​​ソッドを使用してみます。

[DllImport("ImportDLL.dll")]
 public static extern int fnMultiply(int a, int b);

そして、これをC#で呼び出そうとします int a = fnMultiply(5, 6);//この行はエラーになりますエントリポイントが見つかりません

誰かが私が欠けているものを知ることができますか?ありがとう。

4

2 に答える 2

2

ネイティブDLLからC関数をエクスポートする場合は、__stdcall呼び出し規約WINAPI(つまり、ほとんどのWin32 API Cインターフェイス関数で使用される呼び出し規約と同等であり、.NET P /のデフォルト)を使用することをお勧めします。呼び出す):

extern "C" MYDLL_API int __stdcall fnMultiply(int a, int b)
{
    return a*b;
}

// Note: update also the .h DLL public header file with __stdcall.

さらに、名前のマングリングを回避したい場合は、 .DEFファイルを使用してエクスポートすることをお勧めします。たとえば、ネイティブDLLプロジェクトに.DEFファイルを追加し、そのコンテンツを次のように編集します。

LIBRARY MYDLL
EXPORTS
  fnMultiply @1
  ...

(コマンドラインツール、またはDependency WalkerなどのGUIツールを使用して、関数がDLLからエクスポートされる実際の名前を確認できます。)DUMPBIN/EXPORTS

次に、C#から次のようにP/Invokeを使用できます。

[DllImport("MyDLL.dll")]
public static extern int fnMultiply(int a, int b);
于 2012-09-30T09:47:23.047 に答える
1

エクスポートする関数の名前マングリングをオフにします。大いに役立つはずです。別の方法として、mangledという名前をロードすることもできます(これを行うためにDllImport属性を構成する方法があるので、聞いていますが、私はC#エンジニアではないので、存在するかどうかを確認するのはあなたに任せます)。

extern "C" IMPORTDLL_API int fnMultiply(int a , int b)
{
    return (a*b);
}
于 2012-09-30T09:14:30.103 に答える