carregar bibliotecas nativas em .NetCore 2.1 (Windows)

votos
1

Estou tentando carregar bibliotecas nativas em .NetCore 2.1 como este:

[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);
}

Mas a função LoadLibrary retorna zero sempre. Este código funciona bem com o .NET Framework.

Eu não sou realmente certo se carregar bibliotecas nativas é suportado no .NetCore. Se for possível, qual é a maneira correta de fazê-lo?

Publicado 27/11/2018 em 17:59
fonte usuário
Em outras línguas...                            


1 respostas

votos
2

Eu acho que você está usando uma DLL de 32 bits. Em Netcore, uma DLL de 32 bits não pode ser carregado com um processo de 64 bits. Tente este código para verificar:

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);
        }
    }

Atualização : Se você quiser forçar Netcore é executado em flatform x86 (para usar DLL de 32 bits). Primeiro baixe Netcore x86 de https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.1.500-windows-x86-installer . Então você deve editar .CSPROJarquivo, adicionando RunCommande mudando PlatformTargetpara 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>
Respondeu 28/11/2018 em 05:00
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more