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

这真是让人不悦:重复属性似乎效率低下,并且破坏了函数原型(prototype)的可读性。特别是因为我要导入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#?,但它建议通过LoadLibraryGetProcAddress动态加载函数,但我觉得可读性较差。

最佳答案

不,没有办法将Attributes简化为一个声明。您需要将Attribute应用于所有方法。

但是您至少可以将Attribute声明缩短为[DllImport(DLL_Path)],因为您为 CallingConvention CharSet 指定的值与默认值相同。

关于C#:一个用于多个声明的属性(DLLImport),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15781627/

10-10 18:29