Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多次调用C#非托管DllentPoint 我面对的是一个奇怪的问题,它的方法是从C语言调用的非托管C++ DLL。_C#_.net_Multithreading_Dll_Unmanaged - Fatal编程技术网

多次调用C#非托管DllentPoint 我面对的是一个奇怪的问题,它的方法是从C语言调用的非托管C++ DLL。

多次调用C#非托管DllentPoint 我面对的是一个奇怪的问题,它的方法是从C语言调用的非托管C++ DLL。,c#,.net,multithreading,dll,unmanaged,C#,.net,Multithreading,Dll,Unmanaged,我的问题是: 我必须使用非托管C++ DLL(我们称之为MyDll),它输出函数“步骤”,并将指针输出到变量,这些变量“STEP”函数用作输入,并存储输出。我想反复调用“步骤”函数(假设它计算步骤中的任何内容,我想一步一步地进行)。 此DLL对其他非托管DLL有一些其他依赖项。为了在C#中实现这一点,我使用LoadLibrary加载“mydll”的所有依赖项,然后加载LoadLibrary(“mydll”)。我使用LoadLibrary是因为dll的名称在运行时解析的不同情况下可能不同。我在调用

我的问题是: 我必须使用非托管C++ DLL(我们称之为MyDll),它输出函数“步骤”,并将指针输出到变量,这些变量“STEP”函数用作输入,并存储输出。我想反复调用“步骤”函数(假设它计算步骤中的任何内容,我想一步一步地进行)。 此DLL对其他非托管DLL有一些其他依赖项。为了在C#中实现这一点,我使用LoadLibrary加载“mydll”的所有依赖项,然后加载LoadLibrary(“mydll”)。我使用LoadLibrary是因为dll的名称在运行时解析的不同情况下可能不同。我在调用函数本身或从指针获取数据方面没有任何问题。 我正在为步骤方法使用委托,然后调用-find方法返回具有匹配签名的委托
findmethodinddll(“步骤”).invoke()

然而,发生的是'mydll'的'dllentypoint'方法被多次调用。我发现在调用“step”函数之间有一个暂停(10毫秒睡眠)时,就会发生这种情况。 使用Process Monitor和设置断点进行的进一步调试表明,为了调用“step”函数,当代码在断点之后恢复时以及当下一个断点被命中时,线程被创建,线程被退出

在理想情况下,这将在“mydll”的“dllentryPoint”中处理,以防止线程进入/退出时出现不必要的行为。不幸的是,我真的没有修改“mydll”源代码的选项(它们是遗留DLL)

有没有办法防止C#中出现这种行为(多个条目进入dllEntryPoint,而不是一个条目)?还是我在这过程中误解了什么,根本原因是我错过了什么? 你有什么建议可以让我试试吗


提前谢谢

这是正常的,你必须注意这个问题。每当线程启动或停止运行时,您也会收到回调。其目的是让DLL分配/释放线程本地存储。您可以调用DisableThreadLibraryCalls()以选择不接收更多通知。@HansPassant FDR始终是“DLL\U THREAD\U ATTACH”,而不是其他。DisableTreadLibrary调用nees以在未更改的DLL中调用,但正如我提到的,我无法修改它。我确实试着在c#中dll的句柄上校准它,但我没有帮助。