使用优雅以逃避进口大象:过度dll进口的情况

时间:2012-07-07 20:55:38

标签: c# marshalling dllimport graphic

我正在使用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);

3 个答案:

答案 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)

DllImport有一个限制,使其仅适用于方法。虽然它可能变得丑陋,但非常简单并且真正反映了它的意图。

现在我想到了两件事:

  1. 使用部分类并将导入拆分为多个文件。它会使每个文件变小,不会伤到你的眼睛;
  2. 使用T4生成包含导入的类,并忘记它的存在。