C++のdllで定義された機能は次のとおりです。関数ポインタをC#からC++のDLLに渡すには?
static double (*Func1)(double);
EXTERN_C __declspec(dllexport) __stdcall double TestDelegate(double (*fun)(double))
{
Func1 = fun;
return Func1(25.0);
}
void My_Real_purpose()
{
SomeClass a;
a.SetFunction(Func1);//Define behaviour of a by C# in runtime
a.DoSomething();//Even I want it runs in another thread!
}
そして、私はこのようなC#で、それを呼び出そうとしました:
class A
{
[DllImport("DllName.dll")]
public extern static double TestDelegate(IntPtr f);
public delegate double MyFuncDelegate(double x);
public static double MyFunc(double x)
{
return Math.Sqrt(x);
}
static MyFuncDelegate ff;
static GCHandle gch;
public static double Invoke()
{
ff = new MyFuncDelegate(MyFunc);
gch = GCHandle.Alloc(ff);
double c = TestDelegate(Marshal.GetFunctionPointerForDelegate(ff));//Error occurs this line
gch.Free();
return c;
}
}
それが実行されるとき、VS2012は、エラーを表示しerror.Butせずにコンパイルされています「アクセス違反例外」の
私は、IntPtrではなくデリゲートを渡すなど、多くの方法を検索して試しましたが、すべてが失敗していました。
したがって、関数ポインタを含むdllでAPI関数を使用する正しい方法は何ですか?または「My_Real_purpose」関数を実現する方法はありますか?
可能な重複:
あなたは、このようにそれを呼び出すことができます - 関数の引数には、ワイド文字列(LPCWSTR)が含まれています](http://stackoverflow.com/questions/6282264/pass-a-function-pointer-from-c-to-be-called-by-c-sharp- arguments-of-function) –
この質問はCOMとは関係がないため、COMタグを削除しました。 PInvokeタグがより適切です。 –
デリゲートの宣言が間違っていますが、AVEを説明するには不十分です。このクラッシュを診断できるように、C++コードをデバッグする方法を理解しておいてください。スタックトレースを表示します。 –