c# - C++/cli : Cannot convert parameter 1

标签 c# c++ .net visual-studio-2010 command-line-interface

我正在尝试将使用 DLL 的 C# 代码转换为 C++,以便我的 C++ 应用程序可以使用 DLL。所以我在这里开发一个 C++/cli 应用程序

我正在编写此 C# 代码:

private void SendUSBData(byte[] Data)
{
    if (this.USB.SpecifiedDevice != null)
    {
        this.USB.SpecifiedDevice.SendData(Data);
    }
}

SendData() 是 dll 中可用的方法。以下是它在dll中的定义

public void SendData(byte[] data);

好的,现在在我的 C++ 代码中,我尝试像这样转换 C# 代码

void MissileLauncher::sendUSBData(unsigned char *data)
{
    if(usb.SpecifiedDevice!=nullptr)
    {
        //System::Byte
        usb.SpecifiedDevice->SendData(&data);
    }
}

运行这段代码时出现以下错误

1>------ Build started: Project: CallToCSharp, Configuration: Debug Win32 ------
1>  MissileLauncher.cpp
1>MissileLauncher.cpp(200): error C2664: 'UsbLibrary::SpecifiedDevice::SendData' : cannot convert parameter 1 from 'unsigned char **' to 'cli::array<Type,dimension> ^'
1>          with
1>          [
1>              Type=unsigned char,
1>              dimension=1
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我也尝试了以下方法

void MissileLauncher::sendUSBData(array<System::Byte>^data)
{
    if(usb.SpecifiedDevice!=nullptr)
    {
        //System::Byte
        usb.SpecifiedDevice->SendData(&data);
    }
}

它给了我以下错误

1>------ Build started: Project: CallToCSharp, Configuration: Debug Win32 ------
1>  MissileLauncher.cpp
1>MissileLauncher.cpp(125): error C2664: 'MissileLauncher::sendUSBData' : cannot convert parameter 1 from 'unsigned char *' to 'cli::array<Type> ^'
1>          with
1>          [
1>              Type=unsigned char
1>          ]
1>MissileLauncher.cpp(159): error C2664: 'MissileLauncher::sendUSBData' : cannot convert parameter 1 from 'unsigned char *' to 'cli::array<Type> ^'
1>          with
1>          [
1>              Type=unsigned char
1>          ]
1>MissileLauncher.cpp(164): error C2664: 'MissileLauncher::sendUSBData' : cannot convert parameter 1 from 'unsigned char *' to 'cli::array<Type> ^'
1>          with
1>          [
1>              Type=unsigned char
1>          ]
1>MissileLauncher.cpp(166): error C2664: 'MissileLauncher::sendUSBData' : cannot convert parameter 1 from 'unsigned char *' to 'cli::array<Type> ^'
1>          with
1>          [
1>              Type=unsigned char
1>          ]
1>MissileLauncher.cpp(186): error C2664: 'MissileLauncher::sendUSBData' : cannot convert parameter 1 from 'unsigned char *' to 'cli::array<Type> ^'
1>          with
1>          [
1>              Type=unsigned char
1>          ]
1>MissileLauncher.cpp(188): error C2664: 'MissileLauncher::sendUSBData' : cannot convert parameter 1 from 'unsigned char *' to 'cli::array<Type> ^'
1>          with
1>          [
1>              Type=unsigned char
1>          ]
1>MissileLauncher.cpp(200): error C2664: 'UsbLibrary::SpecifiedDevice::SendData' : cannot convert parameter 1 from 'cli::array<Type> ^*' to 'cli::array<Type> ^'
1>          with
1>          [
1>              Type=unsigned char
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我怎样才能摆脱这个?

更新

按照答案中的建议,我尝试了以下代码

void MissileLauncher::sendUSBData(unsigned char *data)
{
    if(usb.SpecifiedDevice!=nullptr)
    {
        int N = 10;
            cli::array<char>^ newData = gcnew cli::array<char>(N);

        for (int i = 0; i < N; ++i)
            newData[i] = data[i];

        //System::Byte
        usb.SpecifiedDevice->SendData(newData);
    }
}

现在,它给我以下错误

1>------ Build started: Project: CallToCSharp, Configuration: Debug Win32 ------
1>  MissileLauncher.cpp
1>MissileLauncher.cpp(206): error C2664: 'UsbLibrary::SpecifiedDevice::SendData' : cannot convert parameter 1 from 'cli::array<Type> ^' to 'cli::array<Type,dimension> ^'
1>          with
1>          [
1>              Type=char
1>          ]
1>          and
1>          [
1>              Type=unsigned char,
1>              dimension=1
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

老实说,我真的不知道我是否按照建议正确编写了这段代码。

最佳答案

您需要转换来自 char* 的数据至 cli::array<char>^ . cli::array模板是实现 System::Array 的东西在 C++/CLI 中。为此,您需要知道数据的长度:

int N = /* length of data */
cli::array<System::Byte>^ newData = gcnew cli::array<System::Byte>(N);
for (int i = 0; i < N; ++i)
    newData[i] = data[i];

关于c# - C++/cli : Cannot convert parameter 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16500892/

相关文章:

C# - 如何列出发布到 ASPX 页面的变量名称和值

c# - ASP.Net Identity 2.0 AccessFailedCount 不递增

c# - 为什么 Stack、Queue 和 List 在删除项目后不收缩内部数组?

c# - 查找具有相同内部表示的 float / double 的最小值/最大值

.net - 是否有任何 .NET ESB?

c# - 从 WM_COPYDATA 消息编码结构

c# - 在C#中的循环内使用lock语句

c++ - 未知 ("templated") 类数量的初始化列表

c++ - 链接GoogleTest和CodeBlocks

c++ - C++中的浮点格式