Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
源C dll中是否需要dllexport才能与[DllImport]一起在C#中使用?_C#_C_Pinvoke_Marshalling_Dllimport - Fatal编程技术网

源C dll中是否需要dllexport才能与[DllImport]一起在C#中使用?

源C dll中是否需要dllexport才能与[DllImport]一起在C#中使用?,c#,c,pinvoke,marshalling,dllimport,C#,C,Pinvoke,Marshalling,Dllimport,我正试图围绕C.dll(pbmman32.dll,如果有人熟悉的话)编写一个包装函数,以便与C#一起使用 查看源代码的头文件,它们似乎没有实现\uu declspec(dllexport),尽管它们确实使用extern“C”{}。我是否仍然可以调用该dll中缺少dllexport行的函数 例如: BOOL PBM_Version (TCHAR* Buffer, WORD* Version, DWORD Size) 进入: \uu declspec(dllexport)是将函数标记为可导出的方便

我正试图围绕C.dll(pbmman32.dll,如果有人熟悉的话)编写一个包装函数,以便与C#一起使用

查看源代码的头文件,它们似乎没有实现
\uu declspec(dllexport)
,尽管它们确实使用
extern“C”{}
。我是否仍然可以调用该dll中缺少dllexport行的函数

例如:

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

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


您应该能够查询DLL以获取所有导出的函数(您可以使用类似的方法)。如果要调用的函数已导出,则您可以继续使用。

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

不过,我对您的翻译表示怀疑。第二个参数可能是一个无符号的2字节类型,作为out参数传递。声明如下:

out ushort version
version>>8解码主要版本号,用
version&0xff
解码次要版本号

仅读取头文件是不够的。您还必须阅读文档


另一个引起关注的领域是
TCHAR
的使用。该库真的提供了ANSI和Unicode导出吗?

我天真地认为它可以工作(除了
StringBuilder
WORD*
变量的
StringBuilder
部分,它可能应该类似于
ref-ushort
),您试过了吗?创建DLL的目的是从中导出函数。方法不止一种。只需使用Visual Studio命令提示符并运行dumpbin.exe/exports pbmman32.DLL,您就会看到导出了什么。请向供应商索要.NET包装器,您可能会遇到麻烦。现在还不能尝试,这张卡是驱动程序与的对话尚未到位。tchar*和word*有何区别,因此我必须传递ref而不是另一个stringbuilder tho?这是我运行该工具得到的结果:。它似乎列出了其中的函数。我看到有一个入口点列。是否需要在DLLImport中指定该入口点?@MikeD当然,您应该在该列表中查找要调用的函数。
out ushort version