在将C#与C ++ / CLI连接时,需要一些引用以更好地理解 out 参数(以及使用的'%'运算符)。 使用VS2012和这个msdn参考:msdn ref
使用/ clr
编译的C ++ DLL代码#pragma once
using namespace System;
namespace MsdnSampleDLL {
public ref class Class1
{
public:
void TestOutString([Runtime::InteropServices::Out] String^ %s)
{
s = "just a string";
}
void TestOutByte([Runtime::InteropServices::Out] Byte^ %b)
{
b = (Byte)13;
}
};
}
和C#代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MsdnSampleDLL;
namespace MsdnSampleApp
{
class Program
{
static void Main(string[] args)
{
Class1 cls = new Class1();
string str;
cls.TestOutString(out str);
System.Console.WriteLine(str);
Byte aByte = (Byte)3;
cls.TestOutByte(out aByte);
}
}
}
此代码的字符串部分(从msdn复制)工作正常。但是当我试图通过传递一个Byte来扩展这个想法时 - 我从编译C#中得到了以下错误
参数1:无法从'out byte'转换为'out System.ValueType'
显然,我只是没有从msdn docs“获取它”。我很感激链接到更好的文档来解释这一点。
答案 0 :(得分:3)
问题在于您的C ++ / CLI声明:
void TestOutByte([Runtime::InteropServices::Out] Byte^ %b)
System::Byte
是值类型,而不是引用类型,因此它不会获得^
。对值类型的引用不是可以用C#表示的东西,因此使用对ValueType
的引用。
摆脱^
上的Byte
,它会正常工作。