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

时间:2012-02-06 19:53:24

标签: c++ dll pinvoke

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

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 获取应用程序的路径,而不将其作为参数传递给导出的函数?

3 个答案:

答案 0 :(得分:2)

@peachykeen(拥有最出色的名字)正确地提出GetModuleFileName建议。获取EXE路径的技巧是将NULL作为hModule参数传递。

来自MSDN:

hModule [in,optional] 正在请求路径的已加载模块的句柄。 如果此参数为NULL,则GetModuleFileName将检索当前进程的可执行文件的路径。

答案 1 :(得分:1)

这很容易,但需要一些预见:

要做的第一件事是在本机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相同)。

答案 2 :(得分:0)

独立应用程序和Windows服务的路径(但不适用于网站):

AppDomain.CurrentDomain.BaseDirectory