首页
学习
活动
专区
工具
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的形式出现在最终返回值对象中。

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

相关·内容

  • 原理解析如何防御DLL劫持

    调用LoadLibrary或者LoadLibraryEx函数时可以使用DLL的相对路径也可以使用绝对路径dll路径搜索规则 但是很多情况下,开发人员都是使用了相对路径来进行DLL的加载。...在win7以上版本 微软为了更进一步的防御系统的DLL被劫持,将一些容易被劫持的系统DLL写进了一个注册表项中,那么凡是此项下的DLL文件就会被禁止EXE自身所在的目录下调用,而只能从系统目录即SYSTEM32...没有获取该目录路径的函数,但会对其进行搜索。 4.Windows目录。使用GetWindowsDirectory函数获取此目录的路径。 5.当前目录 6.环境变量PATH中所有目录。...无论安全DLL搜索模式是否开启,系统总是首先会应用程序(程序安装目录)所在目录加载DLL,如果没有找到就按照上面的顺序依次进行搜索。...dll进行劫持测试 当然这里也有偷懒的方法,批量自动化测试 这里ctrl+s可以直接保存获取的信息文本,然后再通过正则来提取路径信息,再放到批量验证工具里 存在的话就会直接输出结果 不存在就会显示

    2.6K10

    如何Facebook获取流量?

    我认为有一点非常重要 - 像我们这样的营销人员应该理解统计数据是如何工作的,尤其是具有代表性的数据。...我认为这个统计非常有意义,假设你是一个更多依赖于社交媒体的网站,而你社交媒体获得的的流量不到20%,甚至低于15%,那么你可能有一些工作要做,以获得更多机会。...其中一个你可能听说过是Buzzfeed,去年他们发表了一个长篇大论,关于他们如何社交媒体获得70%以上流量,并声称他们不关心搜索,认为搜索优化毫无用处,现在没有人做SEO了,如此等等。...因此,性能(Performance)和交互度(Engagement)的角度来衡量,Facebook的流量属于较低层次。...04 第四点,吸引初次点击的角度来分析,标题往往比内容更为关键。

    5.1K40

    通过修改CoreCLR中的ClrHost实现自托管程序

    当然本篇文章主要是以windows环境为例,通过修改Windowst版本的CoreRun为例来介绍,如何实现一个自己的自托管程序入口。...managedAssemblyFullName; StackSString appLocalWinmetadata; wchar_t* filePart = NULL; COUNT_T size = MAX_LONGPATH; //获取可执行文件路径...2.修改程序集路径获取方式 //声明程序集路径变量 StackSString assemblyPath; //获取可执行文件路径 assemblyPath.Set(appPathPtr); SString...() << Logger::endl; 想实现自托管的方式,就可以参考dotnet publish的生成文件,它生成是将可执行文件.exe与程序集文件同名如: demo.exe 、 demo.dll 这样的文件组织方式...其实解决方案就是得到exeName后,获取当前执行文件的全路径,提取出路径和文件名两个部分,并将文件名进行替换,这样可执行文件在加载时就会默认加载与它同名的程序集文件,来做为ExecuteAssembly

    1.3K30

    WordPress 如何获取网站根目录 path 路径

    WordPress 具备丰富的二次开发接口,便于调用 WordPress 内置的各个功能,能够自定义出自己想的所有功能,所以才会有那么多的主题和插件,在开发中可以通过 home_url 函数获取首页地址...,也可以通过 get_theme_root 获取主题路径,plugin_dir_path 函数获取插件路径,那么如何获取 WordPress 网站更目录 path 的完整路径呢?...WordPress 网站根目录的调用可能只有开发时可能会用到,例如我们某些文件放在网站根目录,但是为了兼容当然 WordPress 程序安装在二级目录中甚至多级目录中,如何要直接调用到 WordPress...根目录的完整路径就需要使用到 ABSPATH 常量。...它是一个常量,包含 WordPress 安装目录的完整路径。更准确地说,它是 wp-config.php 所在目录的完整路径

    2.5K90

    Android如何通过URI获取文件路径示例代码

    前言 最近在工作的过程中,遇到不同 Android 版本下 URI 采用不同方式来获取文件路径的问题。...因为需求的原因,要求拍照上传或者相册中选择图片上传,而且图片是需要经过压缩的,大小不能超过2M。 很快,拍照的这部分就搞定了。那么相册中选择图片的也是一样的道理,应该也是轻松解决了。...intent, FILE_CHOOSER_RESULT_CODE); 之后就是在 onActivityResult(int requestCode, int resultCode, Intent data) 中获取到...最关键的来了,如果通过 URI 来获取文件呢? 比如,现在 URI 为 content://media/extenral/images/media/17766 ,而我们需要得到对应的文件路径。...这是因为在 Android 4.4 及以上的机型,使用了 DocumentUri 来代表获取到文件的 URI 。 所以我们又要对于 DocumentUri 进行适配。

    4K00

    dotnet core 应用是如何跑起来的 通过AppHost理解运行过程

    在 dotnet 的输出路径里面,可以看到有一个有趣的可执行文件,这个可执行文件如何在框架发布和独立发布的时候,找到 dotnet 程序的运行时的,这个可执行文件里面包含了哪些内容 在回答上面的问题之前...将会开始寻找 dotnet 托管入口,以及 dotnet 运行时,通过 hostfxr 的方式加载运行时组件,然后跑起来托管应用 那么在 dotnet 构建输出的可执行文件又是什么?...路径名。...[]) { // 读取嵌入到二进制文件的 App 名,也就是 dotnet 的入口 dll 路径,可以是相对也可以是绝对路径 pal::string_t embedded_app_name;...传入的命令行参数只有两个,一个是可执行文件路径,另一个就是新的 dll 所在路径。如下面代码 AppHostPatcher.exe Foo.exe .

    92720

    你知道如何获取 vue 组件自身源码路径吗?

    这些页面统一为 .vue 组件,那么转换一下:如何获取 vue 单文件自身源码路径? 目前经历了三个方案,最终目标是把自身路径赋值到 this.$options.__source 上。...script> 因为 webpack 编译时,会把源码文件在内部转为 node 模块,.vue 文件中的 script 内容也被转换了, 其中的 __filename 在编译时被运行,直接得到当前文件自身路径....vue 文件下并不准确,路径可能还会带附带 querystring 一开始,坚强的老李用这个方式,给上百个组件手动挂上了路径,但总比手动写死每个路径要好 方案 2 :vue-loader + exposeFilename...__file,上面有准确的路径。 这样只需要改 loader 配置: /* vue.config.js */ module.exports = { // ......,翻车了orz 方案 3 :loader + Custom Block 既然方案 2 不让在生产环境用,那就自己写 loader 去加上这个源码路径,这里采用了 Custom Block[3]。

    2.7K31

    python如何键盘获取输入实例

    python中使用input()函数来获取用户输入 函数 input() 让程序暂停运行,等待用户输入一些文本,获取用户的输入后,Python将其存储到一个变量中,以方便后期使用。...me your name,and I will repeat it back to you:") print(name) 函数 input() 接收一个参数,就是要想用户展示的提示或说明,让用户知道该如何做...print("age = 18") else : print("age < 18") 知识点扩充: Python读取键盘输入 raw_input函数 raw_input([prompt]) 函数标准输入读取一个行.../usr/bin/python str = input("Enter your input: "); print "Received input is : ", str 到此这篇关于python如何键盘获取输入实例的文章就介绍到这了...,更多相关python怎么键盘获取输入内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!

    4.7K20

    IIS 7.5 如何配置伪静态,具体方法如下

    ;   3)选中站点,切换到功能试图,找到 “服务器组件”-> “处理程序映射”,双击之后,在打开窗口右侧的操作栏目下做如下设置:   4)”添加脚本映射”:请求路径 .html ,可执行文件选择 C:...WindowsMicrosoft.NETFrameworkv2.0.50727aspnet_isapi.dll ,如果是4.0.则为C:WindowsMicrosoft.NETFrameworkv4.0.30319aspnet_isapi.dll...,名称随意;   5)”添加通配符脚本映射”:请求路径 * ,可执行文件为:C:WindowsMicrosoft.NETFrameworkv2.0.50727aspnet_isapi.dll,名称随意;...  6)”添加托管处理程序”:请求路径 * ,可执行文件:System.Web.UI.PageHandlerFactory,名称随意;   7)打开站点切换到功能试图,找到 “服务器组件”->”模块”...,5.1到7.5变化还是蛮大的。

    1.7K30

    dotnet core 和 dotnet Framework 启动可执行文件的差别

    而使用 .NET Core 构建出来的应用,将会包含一个 Exe 可执行文件,和对应的 Dll 文件,而 IL 代码将放在 Dll 文件里面。...在用户双击运行此 Exe 可执行文件的时候,将会运行起来这个 Win32 应用,在这里面将调用起 CLR 引擎,执行放在 Dll 的 IL 代码。...官方文档 可以了解到,输出的 Exe 可执行文件里面,格式是符合 PE 格式的文件,但是在 PE 文件中包含了元数据和 MSIL 代码。...此时将会加载 mscoree.dll 进行执行,通过 _CorValidateImage 和 _CorImageUnloading 分别用来通知 operating system loader 托管模块的映像的加载和卸载...其中在 _CorValidateImage 中将执行确保该代码是有效的托管代码以及将映像中的入口点更改为运行时中的入口点。

    73320
    领券