c# - 是否可以构建针对 Linux 和 Windows 的 .Net Core C++/CLI 应用程序
问题描述
我正在尝试构建一个低于 3 层的应用程序
- C#层
- C++/CLI 包装层
- C++ 层
我在 .Net Core 3.1 中构建了 C# 和 C++/CLI 层。但我无法在 Linux 平台上发布它。
从 Microsoft 为 .Net Core 3.1 发布的新闻稿中,其说法如 .Net core C++/CLI 将仅支持 Windows。
有没有其他方法可以在 C++/CLI 层实现平台独立性?
还是有其他方法可以直接从 C# 与 C++ 层进行通信?
我尝试使用 pInvoke 方法。但它不能将 C# 对象传输到 C++。
目标是使用相同的源代码,它应该能够在不使用任何第三方服务的情况下在 Windows、Linux 和 Mac OS 中构建。
注意:对于在 .NetCore 中构建的 C# 应用程序,我们可以实现这一点。我们唯一需要做的就是为不同的平台发布项目。
解决方案
您可以将 C# 对象传输到 C++ trough GCHandle
。您还必须将指向 C# 函数的指针传输到非托管代码中(通过 获取它们GetFunctionPointerForDelegate
)。
然后在您的非托管代码中,您可以调用该函数并将对象句柄作为参数之一传递。
C# 代码示例
public static unsafe void Invoke(System.IntPtr instancePtr, int param)
{
var instanceHandle = GCHandle.FromIntPtr(instancePtr);
var instance = ((ClassInstance) instanceHandle.Target);
instance.method(param);
}
因此,您必须将指向Invoke
函数的指针和指向 GCHandle ( GCHandle.ToIntPtr
) 的 IntPtr 传输到 C++ 代码中。
推荐阅读
- ios - 在swift中使用数字数组和算术运算符数组进行数学计算
- c# - Asp.net core web api 显示页面
- html - 当我当前在子目录中时如何在根目录中引用 index.html
- vue.js - 如何更新 vuetify mdi 图标?(Nuxt.js)
- r - Roxygen 文档:图片未显示
- java - Appium:ClassNotFoundException:org.openqa.selenium.remote.internal.ApacheHttpClient$Factory
- c++ - 在 OpenGL 和 SDL 中使用多线程
- mysql - 这些 sql 表中的平均 year_max - year_min 是多少?
- dom - 如何检查 DOM .contains?在clojurescript中?
- sql - 创建行满足条件的 Impala 文本表