. NET Ядро, связывающее неуправляемые двоичные файлы в linux - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь использовать libshout с C# на ubuntu, и мне не удается связать двоичные файлы.

Я добавил это в свой .csproj

<ItemGroup>
    <None Include="libshout.so">
        <Pack>true</Pack>
        <PackagePath>/usr/lib/x86_64-linux-gnu/</PackagePath>
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
</ItemGroup>

В моем C# код, который у меня есть:

[DllImport("libshout.so", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern void shout_init();

Я вижу, что двоичный файл существует

/ usr / lib / x86_64- linux -gnu / libshout.so.3.2.0

Я получаю эту ошибку:

Microsoft.Common.CurrentVersion.targets (4601, 5): [MSB3030] Не удалось скопировать файл "/ home / pc / RiderProjects / icecast-radio-broadcast / Api / libshout.so ", потому что он не был найден.

Я благодарен за любую помощь или подсказку. Спасибо

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Вы можете использовать класс NativeLibrary, чтобы изменить место поиска libshout.so.

static class LibshoutInterop
{
    const string Libshout = "libshout";

    static LibshoutInterop()
    {
        NativeLibrary.SetDllImportResolver(typeof(Libshout).Assembly, ImportResolver);
    }

    private static IntPtr ImportResolver(string libraryName, Assembly assembly, DllImportSearchPath? searchPath)
    {
        IntPtr libHandle = IntPtr.Zero;
        if (libraryName == Libshout)
        {
            // Where where this is looked up
            NativeLibrary.TryLoad("/usr/lib/x86_64-linux-gnu/libshout.so", assembly, DllImportSearchPath.System32, out libHandle);
        }
        return libHandle;
    }

    [DllImport(LibShout, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall))]
    public static extern int shout_init();
}

Том Десейн сделал более подробную запись здесь: https://developers.redhat.com/blog/2019/09/06/interacting-with-native-libraries-in-net-core-3-0/

1 голос
/ 07 мая 2020

кажется, что при указании. DllImport("libshout.so" он смотрит на относительный путь к вашей среде выполнения. Вы можете попробовать скопировать или связать библиотеку с каталогом, в котором работает ваше приложение, или вы можете указать абсолютный путь к DllImport, для этого также потребуются разрешения на чтение файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...