源C dll中是否需要dllexport才能在[DllImport]的c#中使用?

时间:2015-06-16 23:40:10

标签: c# c pinvoke marshalling dllimport

我正在尝试编写一个围绕C.dll(pbmman32.dll,如果有人熟悉它)的包装函数与c#一起使用。

查看源代码的头文件,虽然它们确实使用__declspec(dllexport),但它们似乎并未实现extern "C"{}。我是否仍然可以在dllexport行丢失的情况下调用该dll中的函数?

例如:

BOOL PBM_Version (TCHAR* Buffer, WORD* Version, DWORD Size)

成:

[DllImport("pbmman32.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
public static extern bool PBM_Version(StringBuilder Buffer, StringBuilder Version, System.UInt32 Size);

2 个答案:

答案 0 :(得分:1)

__declspec(dllexport)是将函数标记为可导出的便捷方式,但它不是唯一的方法(例如,它们可能是使用.def文件导出的。

您应该能够查询DLL以获取所有导出的函数(您可以使用http://www.dependencywalker.com/之类的东西)。如果要导出您要呼叫的那个,那么您就可以了。

答案 1 :(得分:0)

供应商可能提供了一个头文件供您在导入时使用,而不是用于构建DLL的版本。更有可能的是,他们使用.def文件导出函数。但是没有强迫使用__declspec(dllexport)。不要担心它的缺席。

我对你的翻译持怀疑态度。第二个参数可能是无符号2字节类型,作为out参数传递。声明如下:

out ushort version

使用version >> 8解码主版本号,使用version & 0xff解码辅助版。

单独读取头文件是不够的。您也必须阅读文档。

引起关注的另一个方面是使用TCHAR。该库是否真的提供ANSI和Unicode导出?