首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从托管DLL获取可执行文件路径

要从一个托管DLL获取可执行文件路径,你需要先确保在代码中正确引用DLL。下面是一个使用P/Invoke的示例代码,该代码展示如何从C#托管代码调用一个C++的导出函数,获取并存储可执行文件的完整路径。要确保你已安装并运行C++编写的生成可执行文件的代码。

代码语言:csharp
复制
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的形式出现在最终返回值对象中。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券