首先,如果我已经问过已经有答案的问题,我很抱歉。我做了一些研究,但我无法得到我想要的东西。我是WCF服务的新手,所以请耐心等待,所以现在的情况是,我有一个非托管的c ++ dll,它有复杂的数据类型,比如结构,联合,它也有一些用户定义的数据类型。我需要的是从wcf服务(c#)连接这个非托管c ++。我有两种选择 1.将非托管c ++ dll的复杂类型编组为c#类型。 2.创建另一个非托管c ++ dll,它接受来自我的wcf服务的基本数据类型,并尝试将这些基本数据类型映射到当前c ++ dll中的复杂数据类型。
我想知道哪个是更好的解决方案,我想知道如何完成第二个选项。如果我错了,请纠正我。谢谢
答案 0 :(得分:0)
这取决于数据类型的复杂程度:如果数据类型不是很复杂,请使用第一个;如果非常复杂,比如结构数组,你可能想要使用第二个。
对于第一种方法,实现很简单,您只需要确保托管端(C#)和非托管端(本机C ++)中的数据类型具有相同的布局,此MSDN Marshaling Data with Platform Invoke给出示例如何做到这一点。它易于实现,但难以调试。例如,如果C#和C#中的结构有很小的差异,例如C#中的char字段被映射到C ++中的int字段,那么程序将崩溃并且没有关于它的详细信息。编组器就像一个黑盒子,你必须阅读大量的文档来了解内部发生的事情。这种方法称为显式PInvoke
对于第二种方法,首先是混合C ++(C ++ \ CLI)DLL项目,而不是本地项目。 C ++ / CLI可以访问本机和托管资源,因此可以在此处用作桥接器。基本的,你需要在C ++ \ CLI中为本机C ++ DLL实现一个包装器,这将是很多实现工作,但你知道发生了什么,它更容易调试。这种方法称为C ++ Interop(隐式PInvoke)。
正如MSDN所说:建议使用C ++ Interop而不是显式PInvoke,因为它提供了更好的类型安全性,实现起来通常不那么繁琐,如果修改了非托管API则更宽容,并且可以提高性能。可以使用显式PInvoke。