C# и PInvoke в 32/64-битную DLL [дубликат]


На этот вопрос уже есть ответ здесь:

Я создаю библиотеку классов, которую надеюсь в конечном итоге поместить на NuGet. Прямо сейчас он нацелен на AnyCPU.

Теперь я хочу PInvoke в DLL, которая поставляется как в 32, так и в 64-битных версиях. Поначалу я думал, что просто ... используйте 32-разрядную версию, но это вызвало исключение BadImageFormatException. Я изменил библиотеку, чтобы она предназначалась только для X86, и хотя это работает, она требует, чтобы вызывающий объект тоже был 32-битным процессом. Это, естественно, не будет работать для проекта NuGet.

Цените любые мысли о том, как работать с 32/64-битными версиями нативной библиотеки и как упаковать это в NuGet (предпочитайте не иметь 2 разных сборок).

1 3

1 ответ:

Вы можете проверить платформу во время выполнения и PInvoke в различных библиотеках DLL.

static void NativeFuncWrapper(){
    if(Environment.Is64BitProcess){
        NativeFuncWrapper64(); //this calls 64-bit dll
    }else{
        NativeFuncWrapper32(); //this calls 32-bit dll
    }
}
Если вы хотите, чтобы он работал без Environment.Is64BitProcess, прочитайте Как узнать, что процесс является 32-разрядным или 64-разрядным программно для альтернативных методов.