|
1
5
有些事情你应该注意。第一种情况是,如果您是从非托管代码调用.NET委托,那么除非您遵循一些非常狭窄的约束,否则您将很痛苦。 理想情况下,您可以在C中创建一个委托#将其传递到托管代码中,将其封送到一个函数指针中,在任意时间内保持它,然后调用它而不产生任何不良影响。.NET文档是这么说的。
因此,使用函数指针的最有效方法是:
考虑到这一点,假设我们在C#中有:
然后在托管C++中(不是) C++/CLI ):
我最近在C++和CLI中没有做过这件事——语法不同——我认为它看起来像这样:
当你真的真的需要在调用前挂起函数指针一段时间后,我已经在C++中做了以下操作:
所发生的情况是,代理不再具有执行转换的thunk,因为它们是隐含的。他们可以自由地闲逛,因为他们被 GC CLR 根据需要释放。我还看到这个方法失败了,特别是在代码静态地在时间开始时注册回调并期望它们一直保持到时间结束的情况下。我在ASP.NET代码背后以及服务器端代码中看到过这种失败 Silverlight WCF 举一个例子来说明什么时候会发生这种情况—假设您有一个包含如下函数的库:
我们的期望是,当您调用分配内存的API时,它将被矢量化到所提供的
登记员把三胞胎塞进保险箱。这样,当调用相应的free时,可以执行以下操作:
当然,这是愚蠢的,因为分配的内存现在被固定在GC堆中,并且会将其碎片化到地狱——但关键是这是可行的。 但是,我个人也看到了这种失败,除非实际的指针是短暂的。这通常意味着包装您的API,这样当您调用一个例程来完成一个特定的任务时,它就会注册回调,执行任务,然后将回调拉出来。 |
|
|
2
6
在CallbacksManager.cpp中,我们实现了由C++和非托管C++代码访问的托管C++/CX类:
最后,这里是如何调用来自非托管C++代码的注册C语言回调:
这是因为尽管不能将托管委托引用作为成员变量存储在 类,您仍然可以从非托管代码检索并调用托管委托,这是上述两个本机C++方法所做的。 |
|
3
1
事实证明,最初问题的答案相当简单,一旦你知道了,整个回调问题就没有问题了。输入缓冲区参数替换为参数对
C++中的包装器应该是这样的
最后一行是小拼图的最后一部分。我必须打电话吗 CoTaskMemFree ,还是元帅会自动帮我? 至于plinth的漂亮文章,我希望用一个静态函数来绕过整个问题。 |
|
|
4
0
使用C++和CLI没有任何意义。 这里是 a real world example 从我的项目。
用于将PNG数据从C#传输到本机cairo API。 您可以看到C函数指针 cairo_read_func_t cairo_image_surface_create_from_png_stream . Here 是一个类似的例子。 |
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |