使用out参数从C#调用C ++ / CLI

时间:2015-02-19 15:56:22

标签: c# reference c++-cli parameter-passing out

在将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“获取它”。我很感激链接到更好的文档来解释这一点。

1 个答案:

答案 0 :(得分:3)

问题在于您的C ++ / CLI声明:

void TestOutByte([Runtime::InteropServices::Out] Byte^ %b) 

System::Byte是值类型,而不是引用类型,因此它不会获得^。对值类型的引用不是可以用C#表示的东西,因此使用对ValueType的引用。

摆脱^上的Byte,它会正常工作。