web-dev-qa-db-ja.com

C#からC ++関数を呼び出す方法

C++コードがあります。このコードには、WindowsモバイルGPSの有効化/無効化機能が含まれています。そのメソッドをC#コードから呼び出したいので、ユーザーがボタンをクリックすると、C#コードがC++コードを呼び出す必要があります。

これは、GPS機能を有効にするためのC++コードです。

#include "cppdll.h"

void Adder::add()
{
// TODO: Add your control notification handler code here
  HANDLE hDrv = CreateFile(TEXT("FNC1:"), GENERIC_READ | GENERIC_WRITE,
                0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if (0 == DeviceIoControl(hDrv, IOCTL_WID_GPS_ON, NULL, 0, NULL, 0, NULL, NULL))
  {
     RETAILMSG(1, (L"IOCTL_WID_RFID_ON Failed !! \r\n")); return;
  }
     CloseHandle(hDrv);

 return (x+y);
}

そして、これはヘッダーファイルcppdll.h

class __declspec(dllexport) Adder
{
  public:
   Adder(){;};
  ~Adder(){;};
 void add();
};

C#を使用してその関数を呼び出すにはどうすればよいですか?

誰か、この問題を手伝ってくれませんか?

15
Piraba

例を挙げましょう。

次のように、エクスポート用のC++関数を宣言する必要があります(最近のMSVCコンパイラーを想定)。

extern "C"             //No name mangling
__declspec(dllexport)  //Tells the compiler to export the function
int                    //Function return type     
__cdecl                //Specifies calling convention, cdelc is default, 
                       //so this can be omitted 
test(int number){
    return number + 1;
}

そして、C++プロジェクトをdllライブラリとしてコンパイルします。プロジェクトのターゲット拡張子を.dllに、構成タイプをダイナミックライブラリ(.dll)に設定します。

enter image description here

次に、C#で次のように宣言します。

public static class NativeTest
{
    private const string DllFilePath = @"c:\pathto\mydllfile.dll";

    [DllImport(DllFilePath , CallingConvention = CallingConvention.Cdecl)]
    private extern static int test(int number);

    public static int Test(int number)
    {
        return test(number);
    }
}

次に、期待どおりにC++テスト関数を呼び出すことができます。文字列、配列、ポインタなどを渡したい場合は、少しトリッキーになる可能性があることに注意してください。たとえば this SO questionを参照してください。

22
Gleno