2015-02-19 1 views
2

Нужно использовать некоторые ссылки, чтобы лучше понять параметр (и используемый оператор '%') при взаимодействии C# с C++/CLI. Использование VS2012 и это MSDN ссылка: msdn ref, вызывающий C++/CLI из C# с параметром out

С ++ кода библиотеки DLL, скомпилированный с/CLR

#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; 
     } 
    }; 
} 

и С # код:

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#

Аргумент 1: не удается преобразовать из «из байта» до «из System.ValueType»

Так что, очевидно, я просто не «получаю это» из документов msdn. Я буду благодарен за ссылки на лучшую документацию, чтобы объяснить это.

ответ

2

Проблема заключается в вашем объявлении C++/CLI:

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

System::Byte является типом значения, а не ссылочный тип, поэтому он не получает ^. Ссылка на тип значения не является чем-то, что может быть представлено в C#, поэтому вместо этого используется ссылка на ValueType.

Избавьтесь от ^ на Byte, и все будет нормально работать.

+0

Спасибо. Как вы сказали - сейчас все отлично. Время для меня взломать книгу. :? –