1

VS 2010 プロジェクトの一部であり、次のシグネチャを持つ C 関数があります。

real_T wrapper(void)

どこ

typedef double real_T;

私のC#コードでは、これを試みます:

[DllImport(@"C:\Users\bla\Documents\Visual Studio 2010\Projects\bla\bla\Debug\bladibla.dll")]
public static extern double wrapper();

static void Main(string[] args)
{
    wrapper();
}

しかし、得る:

DLL 'C:\Users\bla\Documents\Visual Studio 2010\Projects\bla\bla\Debug\bladibla.dll' に 'wrapper' という名前のエントリ ポイントが見つかりません。

dllは間違いなくそこにあります。他に何が間違っている可能性がありますか?

4

1 に答える 1

3

関数が壊れた名前でエクスポートされている可能性があります。次のようにマングリングを抑制することができます。

extern "C" {
    real_T wrapper(void);
}

明らかに関数もエクスポートしていません。これを行う簡単な方法は次のとおりです。

extern "C" {
    __declspec(dllexport) real_T wrapper(void);
}

それでも不足しているエクスポートが解決しない場合は、Dependency Walker などのツールを使用して、関数が実際にエクスポートされているかどうか、エクスポートされている場合はどのような名前でエクスポートされているかを確認します。

最後に、ネイティブ関数の呼び出し規約と一致するように、C# 側で呼び出し規約を cdecl として宣言する必要があります。

[DllImport(@"...", CallingConvention=CallingConvention.Cdecl)]
public static extern double wrapper();
于 2012-12-03T15:18:37.777 に答える