2009-04-27 4 views
2

C/C++のちょっとしたことを知り、C#と相互作用しています。私は簡単なWin32 DLLを作成し、C#からこれを使用するいくつかの例を調べましたが、DLLに呼び出すときにランタイムエラーが発生します:「TestFuncという名前のエントリポイントを見つけることができません。DLL関数がエクスポートされていません:TestFuncという名前のエントリポイントを見つけることができません。

ヘッダー:

__declspec(dllexport) int TestFunc(char *, char *, char *); 

コードファイル:

#include "stdafx.h" 
#include "TestLib.h" 

__declspec(dllexport) int TestFunc(char *arg1, char *arg2, char *arg3) 
{ 
    char str1[] = "Brady Kelly"; 
    char str2[] = "Hello World"; 
    char str3[] = "1234567890"; 

    strcpy(arg1, str1); 

    return 128; 
} 

私が間違って何をやっている空のプロジェクトオプションを指定して、私のDLLは、このようになります、と私は、Win32 DLLプロジェクトからそれを作成しました?

+0

"1800 INFORMATION"は問題を解決すると思いますが、C#プロジェクトでどのように関数を宣言しましたか? –

+0

@Ahmed、私はこのように宣言します: [DllImport( "TestLib.dll")] public static extern int TestFunc(StringBuilder arg1、StringBuilder arg2、StringBuilder arg3); – ProfK

答えて

6

関数はCまたはC++バインディングを使用してコンパイルされていますか?あなたは指定しませんが、C++コンパイラを使用している可能性があると私は思っています。コンパイラはCコンパイラとは非常に異なる名前のmanglingを使用していますので、単に "TestFunc"という名前を見つけることはできませんCコンパイラを使用しているか、またはCネーム・マングリング・ルールを使用しているかのように。

単にヘッダファイルでこれを使用し、ルールをマングリングC名を使用するC++コンパイラに指示するには、次の

extern "C" 
{ 
    __declspec(dllexport) int TestFunc(char *, char *, char *); 
} 
+0

ちょうどあなたを示す、私は名前のmanglingを知らなかった。ありがとう! – ProfK

+0

まさに私が必要なもの! –

2

また、あなただけ(ヘッダファイル内)関数宣言の前にdeclspecを必要とします、定義ではない。 DLLからエクスポートされるものとDLLが依存するものを調べるのに役立つツールは、Dependency Walkerです。これは、あなたが両方のクライアントのコードとコード内で同じヘッダーを使用できるようになる

#ifdef __cplusplus 
extern "C" { 
#endif 

#ifdef EXPORT_MODE 
#define METHODTYPE __declspec(dllexport) 
#else 
#define METHODTYPE __declspec(dllimport) 
#endif 

#ifdef __cplusplus 
} 
#endif 

/*! _The_ method */ 
METHODTYPE int TestFunc(char *, char *, char *); 

2

は実際にあなたがCとして、この質問をタグ付けしておりますので、私は何を1800 INFORMATIONの溶液からマイナーチェンジをお勧めしたいです。

NB:依存関係ウォーカーは、もはやVS2008にバンドルされていません。 VS2008を使用している場合は、ダウンロードする必要があります。

関連する問題