将 UWP 对象从 C++ 发送到 C#

Send UWP Object from C++ to C#

我在 C++ 中有生成一个 SpatialCoordinateSystem instance and wish to send this over for my C# code to use. I saw here 的代码,如果我有一个指向所述对象的本机指针,我可以简单地在 C# 中创建这样一个实例,所以这是我最初的方法。不幸的是,我无法让它工作,因为在尝试将指针从 C++ 传递到 C# 时,我一直遇到访问冲突错误。任何帮助将不胜感激(注意:不需要使用在 C# 中创建对象的本机 Microsoft 函数,这对我来说最有意义)。

C++(coords是我的头文件中定义的全局变量):

void* getCoords() {
    if (coords == nullptr) {
        SpatialLocator loc = SpatialLocator::GetDefault();
        coords = loc.CreateStationaryFrameOfReferenceAtCurrentLocation().CoordinateSystem(); 
    }


    return &coords;
}

C#:

[System.Runtime.InteropServices.DllImport("MyDLL.dll", EntryPoint = "getCoords"]
public static extern IntPtr getCoords();

public static SpatialCoordinateSystem GetCoordinateSystem()
{
    IntPtr ptr = getCoords();
    return SpatialCoordinateSystem.FromNativePtr(ptr);
}

您可以使用 COM 将数据从 C++ 传输到 C#。您需要做的是在 C# 代码中创建类似的结构(在您的情况下为 COORD)。然后在 C# 代码中创建一个接口并在该接口内实现一个函数,该函数将接受该结构类型 (COORD) 的参数。现在,您只需在 CMD 提示符下创建一个 tlb 文件。要制作 tlb 文件,您需要做的是在您的工作目录(放置 C# 代码项目的位置)中制作一个空的 .bat 文件(您可以将其命名为 RegisterTlb.bat)并使用记事本并在该 .bat 文件中写入以下命令:

 "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm.exe"  
 "your_C++_exe_name.exe" /tlb your_C#_interface_name.tlb" 

这里的接口名就是你刚刚实现的那个函数。 现在只需使用管理员模式打开命令提示符并将目录(在命令提示符下使用 cd 命令)更改为放置 bat 文件的 c# 项目目录,然后在命令提示符下简单地输入 bat 文件名(扩展名为 .bat)。它将向您显示类型注册成功的消息。现在您将看到带有 .tlb 的新文件已自动生成在您的 c# 项目目录中。复制该 .tlb 文件,将其粘贴到 c++ 项目目录中并再次构建 c++ 项目。您会看到在您的 C++ 代码中将生成一个智能指针,其名称与您的接口名称(您在 C# 代码中创建的接口)相同,但带有 Ptr 后缀,如“interface_namePtr”。现在你可以在 C++ 中调用你的 C# 函数:

interface_namePtr->functionName(structureParamenter (COORD) with data)

这将自动传输您的数据。

为简单起见做一件事(即使我在这里感到困惑)。使您的接口名称和您的 c# 项目名称相同。