【发布时间】:2013-04-03 07:44:51
【问题描述】:
我正在使用[DLLImport] 属性来访问我的.NET 代码中的一堆C++ 函数。
目前,我通过以下方式拥有所有功能:
const string DLL_Path = "path\\to\\my\\dll.dll";
[DllImport(DLL_Path,
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
public static extern int MyFunction1();
[DllImport(DLL_Path,
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
public static extern ErrorCode MyFunction2(int id);
[DllImport(DLL_Path,
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
public static extern ErrorCode MyFunction3(string server, byte timeout,
ref int connection_id, ref DeviceInfo pInfos);
[DllImport(DLL_Path,
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
public static extern ErrorCode MyFunction4([MarshalAs(UnmanagedType.LPArray)] byte[] pVersion,
ref int psize);
[DllImport(DLL_Path,
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
public static extern ErrorCode MyFunction5(int errorcode,
[MarshalAs(UnmanagedType.LPTStr)] string pmsg, ref int psize);
这很不讨人喜欢:属性的重复似乎效率低下,并且破坏了函数原型的可读性。特别是因为我有 20 或 30 个函数要导入。
我想知道我是否可以在某个地方只使用一次 [DllImport(DLL_Path, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] 部分并且更清楚地识别函数定义,例如这个伪代码:
const string DLL_Path = "path\\to\\my\\dll.dll";
// some code defining a section which tells that the next functions are DLLImport
[DllImport(DLL_Path, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
{
public static extern int MyFunction1();
public static extern ErrorCode MyFunction2(int id);
public static extern ErrorCode MyFunction3(string server, byte timeout, ref int connection_id, ref DeviceInfo pInfos);
public static extern ErrorCode MyFunction4([MarshalAs(UnmanagedType.LPArray)] byte[] pVersion, ref int psize);
public static extern ErrorCode MyFunction5(int errorcode, [MarshalAs(UnmanagedType.LPTStr)] string pmsg, ref int psize);
}
这可能吗?
我在 SO:Shorten amount of DllImport in C#? 中发现了这个问题,但它建议通过 LoadLibrary 和 GetProcAddress 动态加载函数,我觉得这不太可读。
【问题讨论】:
-
答案是否定的,坚持现有的,顺眼与否。
-
这家伙太卑鄙了!你不想有时改变事情的顺序吗?还是你坚持现有的东西,并且从未梦想过一个导入 DLL 函数更容易、更漂亮的世界?
标签: c# attributes dllimport