使用 out 参数从 C# 调用 C++/CLI
calling C++/CLI from C# with out parameter
需要一些参考资料以更好地理解 out 参数(以及使用的“%”运算符)在将 C# 与 C++/CLI 连接时。
使用 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 复制)工作正常。但是当我试图通过传递一个要填充的字节来扩展这个想法时——我在编译 C#
时遇到了以下错误
Argument 1: cannot convert from 'out byte' to 'out System.ValueType'
很明显我不是来自 msdn 文档的 "getting it"。我希望能链接到更好的文档来解释这一点。
问题出在您的 C++/CLI 声明中:
void TestOutByte([Runtime::InteropServices::Out] Byte^ %b)
System::Byte
是值类型,不是引用类型,因此它不会得到 ^
。对值类型的引用不能在 C# 中表示,因此使用对 ValueType
的引用。
去掉 Byte
上的 ^
就可以了。
需要一些参考资料以更好地理解 out 参数(以及使用的“%”运算符)在将 C# 与 C++/CLI 连接时。 使用 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 复制)工作正常。但是当我试图通过传递一个要填充的字节来扩展这个想法时——我在编译 C#
时遇到了以下错误Argument 1: cannot convert from 'out byte' to 'out System.ValueType'
很明显我不是来自 msdn 文档的 "getting it"。我希望能链接到更好的文档来解释这一点。
问题出在您的 C++/CLI 声明中:
void TestOutByte([Runtime::InteropServices::Out] Byte^ %b)
System::Byte
是值类型,不是引用类型,因此它不会得到 ^
。对值类型的引用不能在 C# 中表示,因此使用对 ValueType
的引用。
去掉 Byte
上的 ^
就可以了。