2

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

3 回答 3

2

对于 C 风格的 api,这是不可避免的。Windows api 是具有数千个功能的主要示例。用把手把它们绑在一起。句柄是this的 C 风格等价物,是类对象的对象引用。

下一步是 COM 接口,它允许构建对象模型。在 Windows apis 中很常见,看起来你迷失了那个。

然而,这并不能阻止您使用 C# 类创建自己的对象模型,这些类的方法和属性以逻辑方式映射到底层 C 样式 api。实现您的类成员并进行 pinvoke 调用的丑陋代码可以隐藏在 #region 中,您希望永远不必再查看它。

这样做的好处不止一个。考虑对象模型映射确实有助于您理解底层 api。并为您提供大量的单元测试扩展点。并且让您对从混乱中创造秩序感觉非常好。

于 2012-07-07T21:25:03.100 回答
0

尝试仅在项目中引用 dll。有时它可以正常工作,Visual Studio 会为您完成所有工作。如果 Visual Studio 出于某种原因抱怨,请尝试使用工具TblImp.exe。它创建了一个您可以在项目中引用的包装器。

于 2012-07-07T21:09:38.530 回答
0

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

我现在想到两件事:

  1. 使用部分类并将您的导入拆分为多个文件。它会使每个文件变小,并且不会伤害您的眼睛;
  2. 使用T4生成包含导入的类并忘记它的存在。
于 2012-07-07T21:12:39.630 回答