23

dev C++ で DLL を作成しました。DLL の名前は「DllMain.dll」で、2 つの関数が含まれています:HelloWorldShowMe. ヘッダー ファイルは次のようになります。

DLLIMPORT  void HelloWorld();
DLLIMPORT void ShowMe();

ソースファイルは次のようになります。

DLLIMPORT void HelloWorld ()
{
  MessageBox (0, "Hello World from DLL!\n", "Hi",MB_ICONINFORMATION);
}

DLLIMPORT void ShowMe()
{
 MessageBox (0, "How are u?", "Hi", MB_ICONINFORMATION);
}

コードを DLL にコンパイルし、C# から 2 つの関数を呼び出します。C# コードは次のようになります。

[DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void HelloWorld();

[DllImport("DllMain.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void ShowMe();

関数「HelloWorld」を呼び出すと、正常に実行され、メッセージ ボックスがポップアップ表示されますが、関数を呼び出すとエラーが発生ShowMeEntryPointNotFoundExceptionます。この例外を回避するにはどうすればよいですか? extern "C"ヘッダファイルに追加する必要がありますか?

4

3 に答える 3

6
using System;
using System.Runtime.InteropServices;

namespace MyNameSpace
{
    public class MyClass
    {
        [DllImport("DllMain.dll", EntryPoint = "HelloWorld")]
        public static extern void HelloWorld();

        [DllImport("DllMain.dll", EntryPoint = "ShowMe")]
        public static extern void ShowMe();
    }
}
于 2013-05-02T10:52:33.280 に答える
3

役に立ったこと:

  • extern "C" { h ファイル内の関数宣言 } は、C++ 名エンコーディングを無効にします。したがって、C#は関数を見つけます

  • C 宣言に __stdcall を使用するか、C# 宣言に CallingConvention.Cdecl を使用します。

  • BSTR/_bstr_t を文字列型として使用し、他の vb 型を使用することもできます。http://support.microsoft.com/kb/177218/EN-US

  • 「PInvoke Interop Assistant」をダウンロードhttps://clrinterop.codeplex.com/releases/view/14120 3 番目のタブに .h ファイルから関数宣言を貼り付け = c# 宣言。dll ファイル名に置き換えます。

于 2015-01-09T02:32:46.260 に答える