在 C# 项目中导入C++ dll

Import C++ dll in C# project

本文关键字:C++ dll 导入 项目      更新时间:2023-10-16

我有一个用于监视打印机的C++ dll(使用FindFirstPrinterChangeNotification(。我正在为它制作 C# 包装器:

private static class NativeMethods {
[DllImport("kernel32", SetLastError = true)]
public static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32", SetLastError = true)]
public static extern bool FreeLibrary(IntPtr hModule);
}
public string LibPath;
private IntPtr LibPtr;
private GBtMX GBtMain;
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void GBtMX();
public GhostBuster() {
LibPath = AppDomain.CurrentDomain.BaseDirectory + @"GhostBusterC.dll";
}
public string Init() {
if (!File.Exists(LibPath))
return "Incorrect path " + LibPath;
LibPtr = NativeMethods.LoadLibrary(LibPath);
if (LibPtr == IntPtr.Zero)
return "Couldn't import library. Error(GetLastWin32Error): " + Marshal.GetLastWin32Error().ToString();
IntPtr GBtMainPtr = NativeMethods.GetProcAddress(LibPtr, "tmain");
if (GBtMainPtr == IntPtr.Zero)
return "No access to GhostBuster.tmain.  Error (GetLastWin32Error): " + Marshal.GetLastWin32Error().ToString();
GBtMain = (GBtMX)Marshal.GetDelegateForFunctionPointer(GBtMainPtr, typeof(GBtMX));            
return "";

它返回"无法访问GhostBuster.tmain。错误 (获取最后Win32错误(: 0"。 我做错了什么? 提前谢谢。

你没有在 p/invoke 中指定SetLastError,所以这就是为什么Marshal.GetLastWin32Error()无法返回任何有用的东西。p/调用应该是

[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr GetProcAddress(
IntPtr hModule, 
[MarshalAs(UnmanagedType.LPStr)]
string lpProcName
);

另请注意,明确处理过程名称是有意义的。这始终是一个 ANSI 字符串,反映 PE 格式。

当您进行此更改时,我希望错误将ERROR_PROC_NOT_FOUND,指示DLL不会导出具有您传递给GetProcAddress的名称的任何内容。

检查函数名称拼写是否正确。你把字母大小写对了吗?生成 DLL 时是否应用了任何修饰或重整?使用dumpbin或依赖关系查看器等工具检查 DLL 导出的名称。