загрузить нативные библиотеки в .NetCore 2.1 (Windows) - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь загрузить собственные библиотеки в .NetCore 2.1 следующим образом:

[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);

[DllImport("kernel32.dll")]
public static extern bool SetDllDirectoryA(string lpPathName);

    ...

SetDllDirectoryA(pathToDll);

var pDll = LoadLibrary(pathToDll+dllName);
if (pDll == IntPtr.Zero)
{
    throw new System.ArgumentException("DLL not found", "pDll");
}

Но функция LoadLibrary всегда возвращает ноль. Этот код отлично работает с .NET Framework.

Я не совсем уверен, поддерживается ли загрузка собственных библиотек в .NetCore.Если это возможно, как правильно это сделать?

1 Ответ

0 голосов
/ 28 ноября 2018

Я думаю, что вы используете 32-битную DLL.В netcore 32-битная DLL не может быть загружена с 64-битным процессом.Попробуйте этот код, чтобы проверить:

class Program
    {
        [DllImport("kernel32.dll")]
        public static extern IntPtr LoadLibrary(string dllToLoad);

        static void Main(string[] args)
        {
            if (System.Environment.Is64BitProcess)
            {
                Console.WriteLine("This is 64 bit process");
            }
            var pDll = LoadLibrary("aDLL.dll");
            if (pDll == IntPtr.Zero)
            {
                Console.WriteLine("pDll: " + pDll);
                throw new System.ArgumentException("DLL not found", "pDll");
            }

            Console.WriteLine("pDll: " + pDll);
        }
    }

Обновление : если вы хотите, чтобы NetCore выполнялась на плоской форме x86 (для использования 32-битной DLL).Сначала загрузите NetCore x86 с https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.1.500-windows-x86-installer. Затем вам нужно отредактировать файл .CSPROJ, добавив RunCommand и изменив PlatformTarget на x86:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <Prefer32Bit>false</Prefer32Bit>
    <PlatformTarget>x86</PlatformTarget>
    <Optimize>false</Optimize>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>
    <RunCommand Condition="'$(PlatformTarget)' == 'x64'">$(ProgramW6432)\dotnet\dotnet</RunCommand>
  </PropertyGroup>

</Project>
...