如何获取当前正在执行的程序集的路径
How Do I Get The Current Executing Assembly's Path
我不知道如何解释,但我会尝试的。这是我正在使用的:
C++:
extern "C" __declspec(dllexport) void c(char path[])
{
//some code with the path.
}
C#:
[DllImport("DLL")]
static extern void c(char[] path);
正如您所看到的,我使用的是一个从c++导出的函数。我的问题是,有没有一种更简单的方法可以从DLL中获取应用程序的路径,而不将其作为参数传递给导出的函数?
这真的很容易,但需要一些预先考虑:
首先要做的是在本机DLL中实现DllMain
,它将在加载DLL时缓存模块的句柄。看起来像:
EXTERN_C BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_opt_ LPVOID lpvReserved)
{
UNREFERENCED_PARAMETER(lpvReserved);
if (fdwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hinstDLL);
g_Handle = hinstDLL;
}
return TRUE;
}
稍后,当您想要获得名称时,只需调用GetModuleFileName
,如下所示:
TCHAR dllName[MAX_PATH + 1];
GetModuleFileName(g_Handle, dllName, MAX_PATH);
如果你想这么称呼它,唯一复杂的部分就是存储DllMain的句柄。调用GetModuleHandle(NULL)
将为您提供执行模块的句柄,而不是DLL(与C#中的GetExecutingAssembly
相同)。
@peacchygean(他有一个非常优秀的名字)正好提出了GetModuleFileName的建议。获取EXE路径的诀窍是将NULL作为hModule参数传递。
来自MSDN:
hModule[in,可选]正在请求其路径的已加载模块的句柄如果此参数为NULL,GetModuleFileName将检索当前进程的可执行文件的路径
独立应用程序和windows服务的路径(但不适用于网站):
AppDomain.CurrentDomain.BaseDirectory
相关文章:
- 程序在执行程序的其余部分之前退出
- 内联程序集printf将整数解释为地址
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- libprotobuf 检查在 Mac OS 上执行程序时失败
- 具有外部"c"和程序集的未定义函数
- 用于将C++代码转换为 Web 程序集的脚本未终止
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 不同于按值传递和常量引用传递的程序集
- 为什么在堆栈和堆上创建变量会产生相同的程序集代码?
- C++变量在调用 x64 程序集函数后重置为 0
- 如何将C++子例程链接到 x86 程序集程序?
- 测试操作系统时执行程序集"sti"时虚拟框崩溃
- 是什么将程序集转换为实际可执行的材料
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 如何获取当前正在执行的程序集的路径
- 在已编译的可执行文件的.text部分中增加或指定间隙,以手动添加程序集代码
- 生成程序集文件,然后编译成可执行文件
- 仅从特定的dot-net程序集执行c++dll调用