Как получить путь к текущей исполняемой сборке - PullRequest
1 голос
/ 06 февраля 2012

Я не знаю, как это объяснить, но я постараюсь.Вот что я использую:

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 ]

2 голосов
/ 09 февраля 2012

@ peachykeen (у которого самое превосходное имя) подходит прямо сейчас с предложением GetModuleFileName .Хитрость для получения пути EXE заключается в передаче значения NULL в качестве параметра hModule.

Из MSDN:

hModule [in, необязательно] Дескриптор загруженного модуля, путь которого запрашивается. Если этот параметр имеет значение NULL, GetModuleFileName извлекает путь к исполняемому файлу текущего процесса.

1 голос
/ 09 февраля 2012

Это действительно легко, но нужно подумать заранее:

Первое, что нужно сделать, это реализовать DllMain в собственной DLL, которая будет кэшировать дескриптор модуля при загрузке 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 (такой же, как GetExecutingAssembly в C #).

0 голосов
/ 07 февраля 2012

Путь для автономного приложения и службы Windows (но не для веб-сайтов):

AppDomain.CurrentDomain.BaseDirectory
...