načíst nativní knihovny v .NetCore 2.1 (Windows)

hlasů
1

Snažím se načíst nativní knihovny v .NetCore 2.1 takto:

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

Ale funkce LoadLibrary vrátí nulu vždy. Tento kód funguje s .NET Framework.

Nejsem si úplně jistý, jestli načítá nativní knihovny je podporován v .NetCore. Pokud je to možné, co je správný způsob, jak to udělat?

Položena 27/11/2018 v 17:59
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Myslím, že používáte 32 bit DLL. V netcore, je 32bit DLL nelze načíst s procesem 64bit. Zkuste tento kód ke kontrole:

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

Aktualizace : Chcete-li vynutit NetCore běží na x86 Flatform (pouze 32bit DLL). První soubor ke stažení NetCore x86 od https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.1.500-windows-x86-installer . Pak byste měli upravit .CSPROJsoubor přidáním RunCommanda změnou PlatformTargetna 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>
Odpovězeno 28/11/2018 v 05:00
zdroj uživatelem

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