2011-11-30 107 views
3

我不知道这是不是个好主意。我在C#中使用了非托管DLL(由我编写)。在非托管DLL中存储“托管”上下文参数

有一些回调函数可以在DLL中设置,但这些回调函数只能映射到C#端的静态类成员。

因为我想对特定的类实例进行回调操作,所以我想知道将类实例指针存储在DLL的状态信息中是否安全。

从DLL的角度来看,这将简单地是一个32位的上下文整数,但是从C#侧这将是一个实际的类“指针”或“参考”,用回调签名定义像这样:

public delegate void StatusChangeHandler(ContextClass context, int someCallbackValue); 

它编译,它似乎工作,我只是不知道这是否有保证。这是一种可接受的做法吗?

+0

mange =寄生螨引起的持续性皮肤病? – spender

+0

糟糕!错字现在已更正。 – user1073363

回答

0

我在这里看到的一个问题是.Net有一个垃圾回收器,它可以移动你的类。所以你保存的指针可能会失效。为了防止这种情况的简单类型你应约束这样的对象:

byte[] b = new byte[1000]; 
// pin b, and get pointer to the first element. 
fixed (byte* ptr = &b) 
{ 
    //use your fixed pointer to b. b will not be moved untill code leaves fixed region. 
} 

虽然,对于复杂的类型,净可能smartenough自动固定对象,我不会依靠这一点。 所以你写的东西是这样的:

var ctx = new Context(); 
fixed (IntPtr ptr = &ctx) 
{ 
    StatusChange(ptr); 
    // do other stuff, and don't leave fixed region, until you can clear the pointer in the native library. 
} 

不过说真的,我觉得一个更简单和可靠的方式将是创建一个静态字典的上下文对象,并给您的本机DLL只对字典的关键,它可以是数字,字符串或GUID。例如。任何有价值的东西,不是指针。

+0

谢谢,是的,这些也是我的担忧。我会按照你的建议去使用索引。 – user1073363