要从一个托管DLL获取可执行文件路径,你需要先确保在代码中正确引用DLL。下面是一个使用P/Invoke的示例代码,该代码展示如何从C#托管代码调用一个C++的导出函数,获取并存储可执行文件的完整路径。要确保你已安装并运行C++编写的生成可执行文件的代码。
using System.Runtime.InteropServices;
// 导入C++ DLL库
[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetExecutablePath(bool mustExist, out StringBuilder sb);
// 可选参数,如果不需要绝对路径,可以设置为false
public static bool MustExist { get { return true; } }
public static string GetExecptionFilePath()
{
// 创建StringBuilder对象,并设置大小
StringBuilder sb = new StringBuilder(260);
// 调用函数,返回指向C++中可执行文件指针的句柄
IntPtr pointer = GetExecutablePath(MustExist, out sb);
// 确保句柄有效,避免潜在的错误
if (IntPtr.Zero == pointer)
{
var errorInfo = Marshal.GetLastWin32Error();
throw new Exception($"获取可执行文件路径时出错: {errorInfo}");
}
// 取回指针指向的缓冲区内容
return sb.ToString();
}
在示例代码中,我们首先导出一个名为 GetExecutablePath 的静态方法,该方法接受一个布尔值参数 (MustExist),用于指定是否必须在可执行文件存在的情况下返回有效路径。方法接收包含可执行文件路径的 StringBuilder 类型的 OUT 参数。
然后,在主要方法的上下文中,我们可以调用 GetExecutablePath
方法并传递可选的 MustExist,然后将返回的可执行文件句柄转换为字符串表示形式。如果句柄无法为null,说明该可执行文件可能不存在。
最后,使用 Marshal.GetLastWin32Error()
方法检查返回的句柄是否为Null。如果该句柄为null(表示在调用 GetExecutablePath
函数时发生了错误),则抛出异常并提供有关错误的信息。否则,可执行文件路径将以String的形式出现在最终返回值对象中。
领取专属 10元无门槛券
手把手带您无忧上云