线程之间以及托管代码和非托管代码之间的绑定

本文关键字:之间 非托管代码 绑定 托管代码 线程 | 更新日期: 2023-09-27 18:33:07

我有一个C++的dll(特别是直接显示过滤器(,它正在第三方程序中使用。我通过共享内存使用C#程序控制它(因此C#端的MemoryMappedFile和C++端的CreateFileMapping(。

所以要清楚:没有 1 个程序。它是同时运行的 2 个不同的程序,我希望非托管代码 (C++( 程序调用托管代码程序 (C#( 中的方法

内存共享工作正常。我可以使用 C# 程序更改和检查值,因为第三方程序使用 dll。

问题是我想有效地将 C# 程序的某些方面数据绑定到 C++ dll 中的值。也就是说,当第三方程序使用的 dll 中的值发生更改时,我希望它在 C# 程序中自动更新。

现在,我当然可以在 C# 程序的另一个线程中每秒轮询一次值。但是我想要的是让我的dll在C#中调用PropertyChangedEventHandler。或者至少调用调用它的方法。

我的第一种方法是通过共享内存通过 IntPtr 传递 C# 方法的委托。

因此,C++查看共享内存,它看到的结构

如下所示
struct MyStruct
{
    //...some ints, etc
    int (*ptr2Func)(int); //not sure if I need to change this to a void pointer, but then how do I cast it to a function pointer in my C++?
    //...etc
}

我的 C# 代码查看共享内存并看到

struct MyStruct
{
    //...the same ints as in the C++
    public IntPtr ptr2Func;
    //etc..
}

正如我所说,共享内存结构中的所有其他值都可以正常工作,我可以手动检查以查看或修改值。

当C++ dll 的主进程初始化时,它将 ptr2Func 设置为 NULL。然后,它在尝试执行它之前确保它不是 NULL。

然后,C# 将其设置为本地方法:

unsafe public delegate int mydelegate(int input);
public myDelegate tempDele;
public int funcToBeCalled(int input)
{
        return (2);
}
// this code is inside a button click method right after it connects the C# program to the shared memory:
tempDele = this.funcToBeCalled;
sharedInstanceOfMyStruct->pt2Func = Marshal.GetFunctionPointerForDelegate(tempDele);

在结构中的函数指针从 NULL 更改为 NULL 并且 DLL 中的代码尝试调用它之前,第三方程序是正常的。

线程之间以及托管代码和非托管代码之间的绑定

我认为你基本上不能这样做。这两个进程在不同的地址空间中运行。存储在共享内存中的地址确实指向 C# 进程中的函数,但它不指向对调用进程进行编码。它只会崩溃。

可以使用 WCF、命名管道或套接字将触发器消息发送到其他应用程序。