- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 C# 库,需要用作纯 C Win32 应用程序的一部分。我正在尝试在 C++ / CLI 中编写包装器可以处理 C# .NET 对象。唯一的问题是整个项目不能用 C++ 编译,它必须留在 C 中。
为了解决这个问题,我想将我的 C# 对象的实例不透明地传递回 C 代码,以便它们可以传入并在包装器库调用中使用,但我不知道该怎么做。例如,我想做这样的事情:
C++/CLI 包装器:
void * ReturnObject(char *name){
return (void *)gcnew MyObject(gcnew String(name));
}
void UseObject (void *object){
MyObject ^handle = (MyObject ^)object;
object -> use();
}
使用 C++ 静态库的 native C 代码:
int main (char **argv){
void *obj = ReturnObject("foobar");
UseObject(obj);
}
所以 C 代码根本不关心 obj
的内容是什么,甚至不知道 CLR 类型 MyObject
,它只是四处传递维护对象持久性的数据。我想这应该用 void
指针来完成,但 C++ 编译器不想进行强制转换。我不知道这是因为托管内存和非托管内存之间的差异,还是我没有正确执行,但我当然会很感激任何帮助。
所以,回顾一下:我正在尝试在 C++/CLI 包装器库中实例化 .net 对象,并将这些对象保存在直接 C 代码中,以便它们可以在我尚未编写的其他 C++/CLI 库调用中再次使用。
有什么建议吗?
最佳答案
您不能在 void* 中存储句柄,因为垃圾收集器可以四处移动对象,使指针变得比无用更糟糕(它现在将指向其他一些随机对象)。
您需要使用 gcroot
C++/CLI 提供的模板。然后您可以存储 gcroot<MyObject>*
进入 void*
并将其传递给您的 C 代码。不要忘记正确释放 gcroot
完成后,以运行析构函数的方式。
您还可以查看 GCHandle
类,它是 .NET 类库的一部分。但是gcroot
建议在 C++/CLI 代码中使用(它在内部使用 GCHandle
)。
关于c# - 在 C 库调用中保留对 .NET 对象的 C++/CLI 句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10092212/
我设置了 Helm 柄和 Helm 柄。我有tiller-deploy。昨天,我可以定期运行了。但今天我收到此错误消息 Error: could not find a ready tiller pod
我以前已将分er安装到特定的 namespace 中。 我设置了一个环境变量来设置'tiller'命名空间-但我不记得该环境变量的名称-而且似乎无法通过网络搜索找到它。 这是什么 key ? 最佳答案
当我在 View 模型中使用如下界面时 class MainViewModel @ViewModelInject constructor( private val trafficImagesR
我正在尝试找到如何在某个 fragment 相关场景中定义 Hilt 的解决方案。我有以下设置: Activity 父 fragment 1 子 fragment 1 子 fragment 2 ...
Hilt 指出如果没有@Provides 注解就不能提供这个接口(interface): interface PlannedListRepository { fun getAllLists()
我的问题非常简单明了:两个注释/示例之间有什么区别: 例子一 @Singleton class MySingletonClass() {} @Module @InstallIn(FragmentCom
我是一名优秀的程序员,十分优秀!