首页 > 解决方案 > 将 char[] 从 C++/CLR 返回到 C#

问题描述

我在 Visual Studio 的一个解决方案中有 2 个项目,一个在 C++ 中与某些硬件通信,一个在 C# 中,构建 GUI 等。

在我的 .cpp 中,我有一些有效的功能:

namespace ISCOPumpLibrary {
    char data[512];

    bool ISCOPump::Connect(char unit, int com, long baud) {
        commport = com;
        speed = baud;
        unitnum = unit;

        connected = commOpen(commport, speed);
        return connected;
    }

    bool ISCOPump::GetInfo() {
        char in[512], out[512];

        in[0] = 'G';

        Execute(in, out);
        strcpy_s(data, out);

        return true;
    }

使用 .h 文件,例如:

namespace ISCOPumpLibrary {
    public ref class ISCOPump
    {
    public:

        static bool Connect(char unit, int com, long baud);
        static bool GetInfo();

这些在 C# 程序中调用如下:

private void Button_GetInfo_Click(object sender, EventArgs e)
{

    bool connected = ISCOPumpLibrary.ISCOPump.Connect(7, 7, 19200);
    bool info = ISCOPumpLibrary.ISCOPump.GetInfo();

    //label_serial.Text += "\r\n" + info;
}

这一切似乎都奏效了。我遇到的问题是我似乎无法找到一种真正有效的方法来返回char data[512]char out[512]

我浏览了一堆答案,但找不到与我的情况相似的答案,大多数人似乎对这些事情的称呼略有不同。

我尝试过使用std::string或有一个论点char*,并且没有任何运气让 C# 喜欢其中任何一个。

关于我应该如何让它工作的任何想法?

解决方案 标题:

namespace ISCOPumpLibrary {

    using namespace System::Runtime::InteropServices;
    using namespace System;

    public ref class ISCOPump
    {
    public:
        // ISCO Implemented functions.

        //returns success bool
        static bool Connect(char unit, int com, long baud);

        //returns string of info
        static bool GetInfo([Out]String^ %c);

cp:

namespace ISCOPumpLibrary {
    bool ISCOPump::Connect(char unit, int com, long baud) {
        commport = com;
        speed = baud;
        unitnum = unit;

        connected = commOpen(commport, speed);
        return connected;
    }

    bool ISCOPump::GetInfo([Out]String^ %c) {
        char in[512], out[512];

        in[0] = 'G';

        Execute(in, out);

        c = gcnew String(out);

        return true;
    }

CS:

    private void Button_Connect_Click(object sender, EventArgs e)
    {

        bool connected = ISCOPumpLibrary.ISCOPump.Connect(7, 7, 19200);

        ISCOPumpLibrary.ISCOPump.GetInfo(out string data);

        label_serial.Text += "\r\n" + data;
    }

请注意,其中一个关键细节是标头中的 using 命名空间系统调用必须在类中,以防止各种冲突。

标签: c#c++-cli

解决方案


推荐阅读