2010-11-06 72 views
1

我有C++ dll的类,我想从C#代码发送字符串,surly我不能使用字符串,因为CLR,我会努力将字符串更改为C++ dll中的字符,并且从c#发送字节(因为在c#中的c + +字节=字节),但c#不理解c + +数组我可以发送1字节,它会好的,但不是数组,请帮助! DLL代码:在C#中使用C++代码

public ref class Coding 
    { 
    public: 
     void HillCoding(char filePath[]) 
     { 

      ... 
     } 
    }; 
+0

你可以与我们分享C++函数的签名吗? – Raphael 2010-11-06 21:17:26

+1

在'P/Invoke'的运行时,CLR会将'string'转换为'char *'我相信 – 2010-11-06 21:17:51

+0

[将非空终止的字符串传递给非托管代码](http://stackoverflow.com/questions/ 3435163/passing-non-null-terminated-strings-to-unmanaged-code) – Hogan 2010-11-06 21:18:48

回答

1

下面是从C#调用C++ DLL函数的工作代码:

sbyte[] A_SB_array = new sbyte[0]; 
    ArrayConvCtoSB(ref A_SB_array, ar_param.ToCharArray()); 
    fixed (sbyte* SB_array = A_SB_array) 
     return CPSFEW.getDataLength(SB_array); 

这不是“很好的代码”,但它说明了你需要。 PS:这里是ArrayConvCtoSB。我不喜欢它,只是为了理解。

static private void ArrayConvCtoSB(ref sbyte[] to_sbyte, char[] from_char) 
    { 
     for (int i = 0; i < from_char.Length; i++) 
     { 
      Array.Resize(ref to_sbyte, to_sbyte.Length + 1); 
      to_sbyte[i] = (sbyte)from_char[i]; 
     } 
    } 

PPS:“固定的”强烈需要forceing垃圾收集器不以清除SB_array存储器:否则它可以。 :)

+0

另外还有一个。这里是getDataLength C++函数的声明:“size_t getDataLength(const char * param){...}” – Badiboy 2010-11-06 21:52:08

+0

它解决了问题,thx man;) – ZAA 2010-11-06 22:27:41

1

试试这个第一,因为CLR转换stringchar *,NO 4

callThisCPlusPlusMethod(myString) 

如果不行,用

char[] sendArray = myString.ToCharArray(); 
callThisCPlusPlusMethod(sendArray); 

或者,如果需要不同的编码:

byte[] sendArray = Encoding.TheEncodingINeed.GetBytes(myString); 
callThisCPlusPlusMethod(sendArray); 

注: 我倾向于喜欢暧昧的名字:)

+0

错误参数1:无法从'string'转换为'std.basic_string ,std :: allocator > *' – ZAA 2010-11-06 21:39:03

+0

如果你的签名与上面的签名相同,那么理论上应该工作,我不知道问题会是什么......你尝试了我发布的所有其他方法吗? – 2010-11-06 21:41:09