Проект .net core, предназначенный для .net framework 4.6.1, не может загрузить неуправляемые сборки из пакета nuget.

У меня есть простое консольное приложение .NET Core, предназначенное для netcoreapp2.0 и net461. Это приложение ссылается на пакет NuGet:

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp2.0; net461</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="runtime.native.Company.Project" Version="1.0.0" />
  </ItemGroup>

</Project>

Пакет NuGet содержит ряд собственных DLL-файлов в каталоге runtimes\win7-x64.

Приложение должно иметь возможность использовать P / Invoke для вызова неуправляемого кода из пакета NuGet:

using System.Runtime.InteropServices;

class Program
{
    static void Main(string[] args)
    {
        scsql_free_memory();
    }

    [DllImport("scsqlprocessor")]
    public static extern uint scsql_free_memory();
}

Это отлично работает при использовании netcoreapp2.0: dotnet run -f netcoreapp2.0. С net461 он не работает:

> dotnet run -f net461
Microsoft (R) Build Engine version 15.5.180.51428 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 15.89 ms for C:\Users\User\Desktop\reproduce\src\Reproduce.csproj.

Unhandled Exception: System.DllNotFoundException: Unable to load DLL 'scsqlprocessor': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
   at Program.scsql_free_memory()
   at Program.Main(String[] args)

Вроде неуправляемые сборки не загружены с net461. Я подозреваю, что это связано с тем, как .NET Framework загружает сборки по запросу. Означает ли это, что мне нужно вручную загружать неуправляемые сборки? Если да, есть ли способ сделать это кроссплатформенным способом?

Это не проблема с загрузкой, это просто обычная ошибка «файл не найден». Это становится неясным, когда вы используете dotnet.exe, ОС не знает ничего лучше, чем нужно искать в каталоге, где хранится dotnet.exe. Скопируйте его туда и посмотрите, решит ли это проблему. Очевидно, что в этом случае вы предпочтете автономный исполняемый файл. Или просто создайте версию, которая вообще не использует .netcore.

Hans Passant 11.04.2018 15:30

@HansPassant, спасибо за ответ. Когда вы говорите «скопировать туда», что вы имеете в виду, что нужно скопировать? Почему ОС по-разному ищет сборки при использовании netcoreapp2.0 и net461? Netcoreapp2.0 подсказывает ОС, где найти сборки? dotnet.exe используется в обоих случаях.

Mackiovello 11.04.2018 15:53
0
2
226
0

Другие вопросы по теме