我正在kernel32.dll
通过以下方法导入第 3 方 DLL 的函数。
private delegate bool MyDelegate(float[] floatArray, UInt16[] intArray);
private static MyDelegate MyDelegateCaller = null;
public static bool MyMethod(ref float[] floatArray, out UInt16[] intArray)
{
if(MyDelegateCaller == null)
{
IntPtr address = GetProcAddress(_dllHandle, "ExternalMethod");
MyDelegateCaller =
(MyDelegate)Marshal.GetDelegateForFunctionPointer(
address,
typeof(MyDelegate)
);
}
return MyDelegateCaller(floatArray, intArray); //*
}
如果我调试并跳过MyDelegateCaller
(at //*
),那么数组会按预期填充。但是,如果我只运行代码,则不会填充数组。
关于发生了什么的任何想法?
更多信息:我使用此方法而不是 PInvoke 来调用 DLL,因为我需要能够在运行时卸载和重新加载 DLL。我尝试添加延迟,在不同的线程中运行作为测试,以尝试模拟跨步的效果。这些方法没有任何跨线程调用,除非 DLL 创建自己的线程,但是,我无权访问 DLL 的代码来验证。
更新
所以我尝试了以下方法(灵感来自这里)
...
);
}
IAsyncResult result = MyDelegateCaller.BeginInvoke(floatArray, intArray, null, null);
while (!result.IsCompleted)
result.AsyncWaitHandle.WaitOne(1000, false); //**
result.AsyncWaitHandle.Close();
return MyDelegateCaller.EndInvoke(result);
}
但是,当我进入//**
程序时会抛出一个System.ExecutionEngineException
.
哈克
让我的代码正常工作。
我从以前的更新中删除了工作并放入MyMethod
了BackgroundWorker
'DoWork
事件。循环过来BackgroundWorker.IsBusy
。
不优雅,但暂时可以。
任何更好的解决方案都非常受欢迎!