【问题标题】:C# Preprocessor Macro AlternativeC# 预处理器宏替代方案
【发布时间】:2013-08-01 17:46:47
【问题描述】:

我正在包装一个包含数百个函数的本机库,在所有这些函数之上键入 DllImport 非常烦人。

有没有办法避免在每个函数上面写这些丑陋/重复的属性?

public const string NativeDll = "mynativelib.dll";

[DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)]
public static extern void foo1();

[DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)]
public static extern void foo2();

[DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)]
public static extern void foo3();

[DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)]
public static extern void foo4();

...

[DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)]
public static extern void fooN();

【问题讨论】:

  • Ctrl+C、Ctrl+V。在 C# 中没有办法,但是您可以在托管 C++ 中编写包装器并直接使用 DLL 头文件。这就是托管 C++ 的用途。
  • 谢谢,但我想在 mono/linux 下使用这个包装器,所以 C++/CLI 不是一个选项。

标签: c# macros c-preprocessor pinvoke


【解决方案1】:

C# 没有预处理器,因此对您的问题的简单回答是,不可能避免为每个 p/invoke 声明编写属性。

现在,您可以编写自己的预处理器或脚本来生成这些 p/invoke 声明。我不相信这值得付出努力,因为 p/invoke 声明往往只编写一次并且不需要维护。

【讨论】:

  • C# 没有独立的预处理器,但它有 the functionality of one。不过,与其他一些语言相比,它非常有限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多