Как загрузить Dll в соответствии с платформой - PullRequest
2 голосов
/ 07 ноября 2011

У меня есть dll для 32-битных и 64-битных, и теперь я хочу, чтобы мой exe-вызов вызывал dll из-за платформы решения, значит, когда установлен x64, тогда вызовет dll из 64-битной. Для этого я объявляю функцию GetPlatform ().

Public Function GetPlateform() As String

    Dim var1 As String
    If (IntPtr.Size = 8) Then
        var1 = hellox64
    Else
        var1 = hello
    End If
    Return var1
End Function

а при загрузке формы этот var1 присваивается var и наконец.

Public Declare Function function1 Lib "var" (ByVal Id As Integer) As Integer

Но когда я отлаживаю код, DllNotFoundException происходит. ПРИМЕЧАНИЕ: DLL находится в vc ++.

Ответы [ 2 ]

3 голосов
/ 30 ноября 2011

Сохраните ваши собственные библиотеки в подпапках и наведите указатель на Library Loader , заполнив соответственно переменную среды процесса PATH с указанием пути к правильной версии для загрузки.

Например, данныйэтот макет дерева ...

Your_assembly.dll
  |_NativeBinaries
      |_x86
          |_your_native.dll
      |_amd64
          |_your_native.dll

... и этот код (извините, C #, нет VB.Net: - /) ...

internal static class NativeMethods
{
    private const string nativeName = "your_native";

    static NativeMethods()
    {
        string originalAssemblypath = new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath;

        string currentArchSubPath = "NativeBinaries/x86";

        // Is this a 64 bits process?
        if (IntPtr.Size == 8)
        {
            currentArchSubPath = "NativeBinaries/amd64";
        }

        string path = Path.Combine(Path.GetDirectoryName(originalAssemblypath), currentArchSubPath);

        const string pathEnvVariable = "PATH";
        Environment.SetEnvironmentVariable(pathEnvVariable,
            String.Format("{0}{1}{2}", path, Path.PathSeparator, Environment.GetEnvironmentVariable(pathEnvVariable)));
    }

    [DllImport(nativeName)]
    public static extern int function1(int param);

    [DllImport(nativeName)]
    public static extern int function2(int param);
}

... function1 и function2 будут динамически связаны с 32- или 64-битной версией собственного кода, в зависимости от размера IntPtr (подробнее об этом в этом посте от Скотт Хансельман или этот вопрос StackOverflow ).

Примечание 1: Это решение особенно полезно, когда обе версииDLL имеют то же имя или если вы не хотите дублировать все внешние ссылки.

Примечание 2: Это уже было успешно реализовано в LibGit2Sharp .

1 голос
/ 07 ноября 2011

Нет, вы не можете динамически создать ссылку на DLL в операторе lib. Однако вы можете (отказ от ответственности: еще не пробовал) создать две ссылки и вызвать соответствующую ссылку в своем коде.

Public Declare Function Function132 Lib "My32BitLib.DLL" Alias "function1" (ByVal Id As Integer) As Integer

Public Declare Function Function164 Lib "My64BitLib.DLL" Alias "function1" (ByVal Id As Integer) As Integer

Затем вам потребуется перейти на платформу и вызвать соответствующее имя псевдонима функции (Function132 или Function164) в зависимости от платформы.

...