Member 12642259 Ответов: 1

Как выборочно загрузить неуправляемую Delphi. dll (32-битную или 64-битную) в соответствии с аркой хост-системы и вызвать ее функции из проекта C#?


Привет,

Я новичок в C# и в настоящее время борюсь с тем, как я могу выборочно загружать неуправляемый файл .DLL в своей программе. Проблема заключается в следующем:

Программа C# должна иметь возможность определять разрядность системы, на которой она работает, загружая правильный файл. dll (32-или 64-битная версия)

MyDLL32bit.dll
MyDLL64bit.dll

Библиотеки dll имеют разные имена, чтобы отразить битовую ширину.

. Программа должна вызывать функции в любой версии .dll, которая загружается (некоторые принимают аргументы, а другие просто возвращают значения). У меня нет доступа к библиотеке dll. Однако я знаю имена функций, параметры, которые они принимают, и значения, которые они возвращают.

Я искал это, и некоторые люди предлагают использовать

[DllImport("MyDLL32bit.dll")]
public static extern int doSomething();

Но могу ли я закодировать программу, чтобы выбрать правильную dll (32-битную или 64-битную) и вызвать функции на правильной версии dll?

Наконец, код должен быть как можно более независимым. Я имею в виду, что если все это можно сделать на C# без необходимости использования Windows API, то это было бы предпочтительнее.

Любая помощь будет очень признательна.

Что я уже пробовал:

Я заглядывал на разные интернет-форумы, такие как этот, и пытался использовать решение Dllimport. Имеющаяся информация очень противоречива и совсем не легка для восприятия.

1 Ответов

Рейтинг:
10

Richard Deeming

Есть несколько предложений в этот поток StackOverflow[^]. Например:

internal static class SafeNativeMethods
{
    [DllImport("MyDLL32bit.dll", EntryPoint = "doSomething")]
    private static extern int doSomething32();
    
    [DllImport("MyDLL64bit.dll", EntryPoint = "doSomething")]
    private static extern int doSomething64();
    
    public static int doSomething()
    {
        return Environment.Is64BitProcess
            ? doSomething64();
            : doSomething32();
    }
}

Ни одна из библиотек не будет загружена до первого вызова extern функция, импортированная из этой библиотеки. Пока ваш код никогда не пытается вызвать функцию из неправильной библиотеки, все должно работать.


[no name]

Ницца