首页 > 解决方案 > 如何部署使用 C++/CLI 库的 C# 库

问题描述

我有一个使用 AnyCPU 构建的 C# 库,但依赖于一些 C++/CLI 库。我已经为 x86 和 x64 Windows 编译了 C++/CLI。似乎我只能将 C++/CLI 库的单个引用添加到 C# 项目中(否则文件会相互覆盖)。我认为有可能有一个 x86 和 x64 文件夹来存放相应的库。但是当我尝试这个时,我会得到关于无法找到库的运行时异常。

有没有办法在我的 AnyCpu 库中同时包含 x86 和 x64,以便在部署它时调用应用程序可以决定他们想要 x86 还是 x64?

标签: c#.netc++-cli

解决方案


基本上你需要做以下事情:

  • 检测进程架构(x86 或 x64)
  • 根据架构加载正确的库

根据流程架构获取要加载的库路径:

    public NativeLibraryLoader(string path32, string path64)
    {
        if (!File.Exists(path32))
            throw new FileNotFoundException("32-bit library not found.", path32);

        if (!File.Exists(path64))
            throw new FileNotFoundException("64-bit library not found.", path64);

        string path;

        switch (RuntimeInformation.ProcessArchitecture)
        {
            case Architecture.X86:
                path = path32;
                break;
            case Architecture.X64:
                path = path64;
                break;
            default:
                throw new PlatformNotSupportedException();
        }

        ...
    }

加载本机库LoadLibrary

    /// <summary>
    ///     https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx
    /// </summary>
    /// <param name="lpLibFileName"></param>
    /// <returns></returns>
    [DllImport("kernel32.dll", EntryPoint = "LoadLibrary", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern IntPtr LoadLibrary(string lpLibFileName);

完整示例:

您可以查看aubio.net,这是我为 aubio 编写的 .NET 包装。它是一个程序集,将根据当前运行的体系结构AnyCPU加载x86或库。x64

这些是您会感兴趣的位:

https://github.com/aybe/aubio.net/tree/master/Aubio/Interop

https://github.com/aybe/aubio.net/blob/master/Aubio/AubioNative.cs

警告:

此方法解释了如何加载本机库而不是托管库。

正如@Flydog57指出的那样,改为加载托管程序集Assembly.Load


推荐阅读