1

我正在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.


哈克

让我的代码正常工作。

我从以前的更新中删除了工作并放入MyMethodBackgroundWorker'DoWork事件。循环过来BackgroundWorker.IsBusy

不优雅,但暂时可以。

任何更好的解决方案都非常受欢迎!

4

1 回答 1

0

我尝试添加延迟,在不同的线程中运行。

添加任意延迟不是线程之间同步的正确方法。您需要等待其他任务完成。

于 2012-07-24T14:20:16.793 回答