私はPに/以下のCメソッド呼び出し、必要があるからDLL持っているとの方法でクラッシュが発生します。P /呼び出しは、構造体と、コールバックパラメータ
P /呼び出しアシスタントを使用int DAOpen(HANDLE *hOpen, UNIT *flags, void *callback, void *userData)
を、私が来ています次のシグネチャを持つアップ:
[DllImportAttribute("<libName>", EntryPoint="DAOpen")]
static extern int DAOpen(
out IntPtr hOpen,
ref uint flags,
IntPtr callback,
IntPtr userData);
コールバックパラメータ次のCシグネチャに対応しなければならないがあります
void CallBack(
int event,
int socket,
struct _iComStructure *plcom,
void *eventData,
void *myData)
さて、私は次のように呼び出しをやってる
delegate void CallBack(
int @event,
int socket,
IntPtr plcom,
IntPtr eventData,
IntPtr myData);
に換算さ:
void MyCallBack(int @event, int socket, IntPtr plcom, IntPtr eventData, IntPtr myData)
{
// does nothing for now
}
IntPtr hOpen;
uint flags = 0;
CallBack callBack = MyCallBack;
StringBuilder userData = new StringBuilder(userData.ToString());
int rc = DAOpen(
out hOpen,
ref flags,
Marshal.GetFunctionPointerForDelegate(callBack), Marshal.StringToHGlobalAnsi(userData.ToString()));
私はこのコードを抱えている問題はそれのいずれかクラッシュしたり、私が取得するということですDAOpenを呼び出すとFatalExecutionEngineError
がスローされます。私はそれがマーシャルエラーでなければならないことを知っていますが、私はそれを理解することはできません...
あなたの助けてくれてありがとう!
ようが示唆された
UPDATE、私は次のようにコールバックを固定しようとした:
GCHandle callbackHandle = GCHandle.Alloc(callBack, GCHandleType.Pinned);
私はこのメッセージにArgumentException
を取得:
Object contains non-primitive or non-blittable data
GCHandleTypeを指定しないとうまくいくようです(つまり、私は漢字を取得しますdle)、当然元の問題が残っています。
私はデリゲートをピンできない理由はありますか?
ありがとうございました!
デリゲートを格納するためのクラス変数を作成しましたが、まだ問題があります。 – XenoAce
@XenoAceネイティブコードに提供するコールバックは、ピンボークコール以外のネイティブコードでも存続する場合は固定する必要があります。 – JaredPar
@Scott Wisniewskiはい、stdcallです。 – XenoAce