如何获取当前正在执行的程序集的路径

How Do I Get The Current Executing Assembly's Path

本文关键字:执行 程序集 路径 何获取 获取      更新时间:2023-10-16

我不知道如何解释,但我会尝试的。这是我正在使用的:

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