C++で設計されたPLSQL Developer IDE用のプラグインとして使用されるC#DLLを作成しています。C#関数にC++ポインタを割り当てる方法
私のC#DLLは、C++ポインタを受け入れ、そのポインタを後で呼び出される関数またはメソッドに割り当てる必要があります。
IDEは、これらのプラグインをビルドするための仕様書を提供しますが、C++とDelphiのサンプルのみを提供します。私はロバートを使用していますことに注意しなければならない
:私はこれまで持って
void (*IDE_MenuState)(int ID, int Index, BOOL Enabled);
BOOL (*IDE_Connected)();
void (*IDE_GetConnectionInfo)(char **Username, char **Password, char **Database);
void (*IDE_GetBrowserInfo)(char **ObjectType, char **ObjectOwner, char **ObjectName);
void RegisterCallback(int Index, void *Addr)
{
switch (Index)
{
case 10 :
(void *)IDE_MenuState = Addr;
break;
case 11 :
(void *)IDE_Connected = Addr;
break;
case 12 :
(void *)IDE_GetConnectionInfo = Addr;
break;
case 13 :
(void *)IDE_GetBrowserInfo = Addr;
break;
}
}
のC#:仕様書は、私はC++の例を提供し、この screenshot.
に含まれてより多くの情報を提供しますGieseckes Unmanaged Exports NuGet関数をエクスポートするためのパッケージ。必要に応じてこれを変更することができます。私はC#のメソッドにC++のポインタ引数を割り当てることができますどのように
public bool IDE_Connected()
{
return false;
}
public void IDE_MenuState(int ID, int Index, bool Enabled)
{
}
[DllExport("add", CallingConvention = CallingConvention.Cdecl, ExportName= "RegisterCallback")]
public static void RegisterCallback(int Index, IntPtr Addr)
{
if (Index == 10)
{
// Assign IntPtr Addr to IDE_MenuState()
// Please help :)
}
if (Index == 11)
{
// Assign IntPtr Addr to IDE_Connected()
// Please help :)
}
}
?
C#で 'void *'型を試しましたか? –
AddPパラメータをintPtrからvoid *に変更できます。それではvoid * Addrをメソッドに代入するにはどうすればいいですか?ありがとう。 –
'Marshal.GetDelegateForFunctionPointer()'を試すことができます –