2009-11-27 159 views
2

我有一个用VC++ 6编写的原生动态链接库,我没有访问源代码的权限。我想将其转换为托管代码,以便C#可以调用此库。问题在于VC6库大量使用std :: vector和std :: string作为函数参数,并且没有办法将这些类型直接封装到C#中。如何从C#调用原生VC++ 6库(使用std :: string作为参数)#

所以我需要的是VC6和C#之间的桥梁,并且我为VC++ 6实现了一个VC++ 2005包装器。但是,我从回复(通过jalf)意识到以下线程:“VC++ 6和VC++ 2005有不同的std :: string定义(并且编译器也可能插入不同的填充和其他更改),结果是垃圾,和/或不可预知的行为和崩溃“。

Passing std::string from VC++2005 to VC++6 DLL results in garbage

所以现在,最大的问题是,我怎么能调用从C#在VC++ 6本地库?

我很茫然,任何帮助,非常感谢。

回答

2

如果您有权访问VC++ 6,请编译“bridging/wrapper”dll。然后,暴露功能类型,你可以P /从C#调用,如Char *等。

顺便说一句, 您可能可以在eBay上获得“使用”许可证或廉价的东西。

编辑:
下面是你问一个示例代码(我想...):

[System.Runtime.InteropServices.DllImport("somedll.dll")] 
public static extern int Fun1(int n, IntPtr[] lpNames); 


////////////////////////////////////////////////////////////////////////// 
List<string> strList = new List<string>(); 

IntPtr[] strPointerArr = new IntPtr[strList.Count]; 
for(int i=0; i<strList.Count; ++i){ 
    strPointerArr[i] = System.Runtime.InteropServices.Marshal.StringToHGlobalUni(strList[i]); 
} 
Fun1(strList.Count, strPointerArr); 

////////////////////////////////////////////////////////////////////////// 
+0

这听起来像在第一个很好的解决方案,但你如何转换这种复杂类型std :: vector 到其他可以从C/P调用的东西? – Lopper 2009-11-27 01:49:22

+0

如果你只需要传递它,'const char **'(即chars的动态数组的动态数组)就可以做到这一点(使用'CoTaskMemAlloc',并要求调用者释放它)。 – 2009-11-27 01:53:52

+0

另一种方式,在VC++ 6中编写的“桥接/包装器”dll想要将char **传递回C#?在这种情况下,内存不能被释放,因为C#不能这样做。 – Lopper 2009-11-27 02:09:35

相关问题