gpt4 book ai didi

c# - 从 native (C++) 线程通过 Marshal.GetFunctionPointerForDelegate 调用托管函数 (C#)

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:56 28 4
gpt4 key购买 nike

我正在使用 Marshal.GetFunctionPointerForDelegate获取指向 native 函数的函数指针。然后,我通过常规 DllImport 机制将此函数指针传递给一些非托管代码。我正在使用它进行回调; native 代码回调托管 (C#) 代码。只要回调发生在同一个线程上,一切都可以正常工作。如果我尝试从我通过 CreateThread 创建的线程调用托管函数它失败了。

是否可以仅通过 GetFunctionPointerForDelegate 返回的函数指针从 native 线程回调托管代码?

C#:

//in class definition
[DllImport("SomeDll")]
public static extern void SetCallback(System.IntPtr function);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public void delegate SomeDelgateType();

public SomeDelgateType OnCallback;

//a function to implement the callback
public void Callback()
{
}

//inside a setup function
OnCallback = new SomeDelgateType(Callback);
SetCallback(Marshal.GetFunctionPointerForDelegate(OnCallback);

当我从 C++ 调用函数指针时出现问题。如果它在使 SetCallback 函数一切正常的原始线程上。如果我使用 CreateThread 创建一个 native 线程,然后尝试通过指针调用该函数,我会得到以下异常:

    Unhandled exception at 0x76674598 (KernelBase.dll) in      MissionControl.exe: 0xE0434352 (parameters: 0x80070057, 0x00000000, 0x00000000, 0x00000000, 0x73DB0000).

使用以下堆栈跟踪:

        KernelBase.dll!_RaiseException@16()    Unknown
clr.dll!RaiseTheExceptionInternalOnly(class Object *,int,int) Unknown
clr.dll!IL_Throw(class Object *) Unknown
02bbc34b() Unknown
[Frames below may be incorrect and/or missing]
[External Code]
native_function_on_different_thread();

最佳答案

事实证明,您实际上可以从非托管线程调用。要注意的是,如果您正在调试托管应用程序,回调中的断点实际上不会进入调试器,但您的代码仍会执行。为了让你的断点工作,你需要启用“ native 代码调试”(即使你的断点在托管代码中!)通过转到 Project -> Properties -> 调试 -> 启用 native 代码调试

关于c# - 从 native (C++) 线程通过 Marshal.GetFunctionPointerForDelegate 调用托管函数 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32062113/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com