首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于dll返回字符串在C#下调用的有关问题

2012-01-22 
关于dll返回字符串在C#下调用的问题c++dll导出函数的原型:externC __declspec(dllexport)voidsay(void)

关于dll返回字符串在C#下调用的问题
c++dll导出函数的原型:  

extern   "C "   __declspec(dllexport)   void   say(void);    
extern   "C "   __declspec(dllexport)   LPTSTR   Picker();

我开始这样在c#中调用  

[DllImport( "..\\mfcdll\\mfcdll.dll ",   EntryPoint   =   "say ")]                                                                        
  public   static   extern   void say();                                                                                                                                          
                                                                                                                                                                                                                                           
[DllImport( "..\\mfcdll\\mfcdll.dll ",   EntryPoint   =   "Picker ")]                                                                
  public   static   extern   string Picker();                                                                                                                            
.........                                                                                                                                                                                                                            



say();                                                                   //ok!                                                                                                                                          

string   str   =   Picker();                                                                                                                                                                              

MessageBox.Show(str);           //error:display   empty   comment                                                        

........                                                                                                                                                                                                                            


我又在网上查找一些资料,有说用StringBuilder可以解决,我又用以下方法:  

[DllImport( "..\\mfcdll\\mfcdll.dll ",   EntryPoint   =   "Picker ")]                                                                
  public   static   extern   StringBuilder Picker();                                                                                                      
.........                                                                                                                                                                                                                            



say();                                                                   //ok!                                                                                                                                          

StringBuilder   sb   =   new   StringBuilder();                                                                                                                    

sb   =   Picker();                                                                                                                                                                                                  

MessageBox.Show(sb.ToString());           //error:出现异常并退出                                                    

........                                                                                                                                                                                                                            

因为我接触c#时间不长,也没有去仔细看StringBuilder的文档,我也不知道以上用法是否正确  

   

最后我又换了以下方法
[StructLayout(LayoutKind.Sequential,CharSet   =   CharSet.Unicode)]                        
public   struct   MyString                                                                                                                                                                      


{                                                                                                                                                                                                                                    
                public   IntPtr   _str;                                                                                                                                                                  
}                                                                                                                                                                                                                                    

[DllImport( "..\\mfcdll\\mfcdll.dll ",   EntryPoint   =   "Picker ")]                                                              

public   extern   static   void   marshalFun(IntPtr   ip);                                                                                      
........                                                                                                                                                                                                                        


IntPtr   ip   =   Marshal.AllocHGlobal(128);                                                                                                                  
marshalFun(ip);                                                                                                                                                                                      
MyString   mystr   =   (MyString)Marshal.PtrToStructure(ip,   typeof(MyString));    
string   str   =   Marshal.PtrToStringUni(mystr._str);                                                                                      

MessageBox.Show(str);                             //此处任然显示空                                                                                  
Marshal.FreeHGlobal   ;                                                                                                                                                                    

.......                                                                                                                                                                                                                          


dll文件应该没有问题,在vc.net   2005   +   WM5   SDK中使用正常,而在C#下调用时,第一个导出函数say()调用正常,而第二个函数picker()始终不能得到正确结果。  

这个问题困扰我两天了,先谢谢大家了:-)  


[解决办法]
C++里面的字符串是存放在byte数组里的,需要知道他的编码才能得到字符串。
C#里string都是unicode编码的16位char数组。
[解决办法]
用System.Text.Encoding.Default.GetBytes();方法比对一下
楼上那位说的很对
C++里面的字符串是存放在byte数组里的,需要知道他的编码才能得到字符串。
C#里string都是unicode编码的16位char数组。
你可以把byte重组成string

热点排行