Giorgi / DuckDB.NET

Bindings and ADO.NET Provider for DuckDB
https://duckdb.net
MIT License
338 stars 61 forks source link

Fails on 32-bit with unclear error message #151

Open mgravell opened 8 months ago

mgravell commented 8 months ago

On .NET Framework, the default target architecture (unless specified explicitly) is "any", IIRC - and will default to x86; the package doesn't have x86 binaries (only x64), so on 32-bit it fails with Unable to load DLL 'duckdb'

Maybe add a 64-bit check, and/or explicitly specify the target architecture?


original report:

~I see that there's a netstandard2.0 package in the nuget, but: it doesn't seem to work; it doesn't work in the tests here, and doesn't work in standalone packages either.~

~If it isn't expected to work on netfx, it might be worth simply dropping the netstandard2.0 target - but this might just be a packaging snafu~

~test setup example:~

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net472</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <LangVersion>12</LangVersion>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="DuckDB.NET.Data.Full" Version="0.9.0.3"/>
    </ItemGroup>
</Project>

~with:~

using DuckDB.NET.Data;

using var conn = new DuckDBConnection("Data Source=:memory:");
conn.Open();

~gives:~

Unhandled Exception: System.DllNotFoundException: Unable to load DLL 'duckdb': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
   at DuckDB.NET.NativeMethods.Startup.DuckDBOpen(String path, DuckDBDatabase& database, DuckDBConfig config, IntPtr& error)
   at DuckDB.NET.Data.Internal.ConnectionManager.GetConnectionReference(DuckDBConnectionString connectionString)
   at DuckDB.NET.Data.DuckDBConnection.Open()
   at Program.<Main>$(String[] args) in C:\Code\ConsoleApp7\ConsoleApp7\Program.cs:line 4
mgravell commented 8 months ago

ah, I understand - editing hugely...

Giorgi commented 8 months ago

When PlatformTarget is AnyCpu or x86 the process is still 64-bit but duckdb.dll doesn't get copied to the output folder so I think adding a Environment.Is64BitProcess won't help at runtime.

image

mgravell commented 8 months ago

Suggestion: if the library has <PlatformTarget>x64</PlatformTarget>, it can't be referenced from an incompatible project - it gives an error message about the mismatch (although that might have problems for linux ARM)

Giorgi commented 8 months ago

Ah I didn't know that. For Linux Arm, there is only a 64bit native binary so will it be a problem?

mgravell commented 8 months ago

I don't know, honestly