C++呼び出しC#ダイナミックライブラリ

1656 ワード

一、C#を書く.dllファイル
namespace Mylib
{
    public class Test
    {
        [DllExport("Testdll", CallingConvention = CallingConvention.Cdecl)]
        public static unsafe string Testdll(int** obj)
        {
            string s= obj[0][0].ToString();
            return s;
        }
}

注意:unsafeの使用
1.unsafeのC#プログラムでの使用の場合:
  • リアルタイムアプリケーションは、ポインタを採用して性能を向上させる.
  • 参照非.NetDLLが提供するC++で記述された外部関数のように、この関数を伝達するためにポインタが必要である.
  • は、実行中のプログラムのメモリ使用状況を検出するためにデバッグされます.

  • 2.unsafeを使うメリットとデメリット
    メリットは、パフォーマンスと柔軟性の向上です.他のdllの関数を呼び出すことができ、互換性が向上します.メモリアドレスが得られます.
    面倒なことに、いくつかの変数が不正に変更されました.メモリが漏れる.
    3.unsafeとunmanagedの違い
    managed codeはCLR監督下で実行されるプログラムである.次のタスクはCLRによって実行されます.オブジェクトメモリの管理、タイプセキュリティ検出、冗長処理です.一方,unmanaged codeはプログラマが直接メモリ操作を行うプログラムである.一方、unsafeはmanagedとunmanagedの間の橋渡しであり、managed codeもポインタを使用してメモリを制御および操作することができます.
    4.unsafeの使用
    unsafeは、クラス、クラスのメンバー関数、クラスのグローバル変数を修飾するために使用できますが、クラスメンバー関数内のローカル変数を修飾するために使用できません.unsafeコードを持つプログラムをコンパイルするにも、「configuration properties>build」でunsafeコードの許可を真に設定します.
    二、コンパイル後に生成する.dllファイルはC++プロジェクトパスの下に入れます
    三、C++プロジェクトで動的ライブラリを呼び出す
    void use()
    {
        int  **p = NULL;
        ...
    	typedef char* (*pfnGCO)(int **obj);
    	pfnGCO fnGCO = NULL;
    	HINSTANCE hdllInst = LoadLibrary(L"Mylib.dll"); //  dll  
    	if (NULL == hdllInst)
    	{
    		cout << "  dll  " << endl;
    	}
    	fnGCO = (pfnGCO)GetProcAddress(hdllInst, "Testdll"); // dll     
    	if (fnGCO == NULL)
    	{
    		cout << "      " << endl;
    	}
    	char* s = (*fnGCO)(p);
    	FreeLibrary(hdllInst);
    	free(p);
    }
    

    注:パラメータは2次ポインタ