使用 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 上的 ^ 就可以了。