首页 > 解决方案 > 是否可以构建针对 Linux 和 Windows 的 .Net Core C++/CLI 应用程序

问题描述

我正在尝试构建一个低于 3 层的应用程序

  1. C#层
  2. C++/CLI 包装层
  3. 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++c++-cli

解决方案


您可以将 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++ 代码中。


推荐阅读