我正在使用DllImport编写与旧版(2012年2月)C程序接口的C#代码。它工作正常,但我需要调用30多种不同的功能,将我通常无可挑剔的精致代码转换成近乎大象的代码。当然必须有办法绕过这个? [警告:那些胃部不好的人可能希望避开他们的眼睛]:
[DllImport("C:\\Users\\mitt\\Documents\\Visual Studio 2010\\Projects\\mrSolution\\mr\\x64\\Debug\\mrDll.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern bool mrEngine_initialize( [In, Out, MarshalAs(UnmanagedType.LPStruct)] PLOT_SPEC PlotSpec);
[DllImport("C:\\Users\\mitt\\Documents\\Visual Studio 2010\\Projects\\mrSolution\\mr\\x64\\Debug\\mrDll.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern bool mrEngine_getDataPoint( [In, Out, MarshalAs(UnmanagedType.LPStruct)] PLOT_SPEC PlotSpec);
答案 0 :(得分:2)
使用C风格的api这是相当不可避免的。 Windows api是具有千功能的一个主要示例。用手柄将它们绑在一起。句柄是C风格的等效于 this ,是类对象的对象引用。
下一步是COM接口,它允许构建对象模型。在Windows apis中非常常见,看起来你已经失去了那个。
然而,这并不能阻止您使用C#类创建自己的对象模型,C#类的方法和属性以逻辑方式映射到底层C样式api。实现你的类成员并进行pinvoke调用的乱码可以隐藏在你希望再也不用看的#region中。
这样做有很多好处。考虑对象模型映射真正可以帮助您理解底层API。并为您提供大量的单元测试扩展点。并且让你感觉真的善于创造混乱的秩序。
答案 1 :(得分:0)
尝试仅引用项目中的dll。有时它只是工作,Visual Studio为你做所有的管道。如果Visual Studio因某些原因抱怨,请尝试使用工具TblImp.exe。它创建了一个可以在项目中引用的包装器。
答案 2 :(得分:0)