c# - 如何部署使用 C++/CLI 库的 C# 库
问题描述
我有一个使用 AnyCPU 构建的 C# 库,但依赖于一些 C++/CLI 库。我已经为 x86 和 x64 Windows 编译了 C++/CLI。似乎我只能将 C++/CLI 库的单个引用添加到 C# 项目中(否则文件会相互覆盖)。我认为有可能有一个 x86 和 x64 文件夹来存放相应的库。但是当我尝试这个时,我会得到关于无法找到库的运行时异常。
有没有办法在我的 AnyCpu 库中同时包含 x86 和 x64,以便在部署它时调用应用程序可以决定他们想要 x86 还是 x64?
解决方案
基本上你需要做以下事情:
- 检测进程架构(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
。
推荐阅读
- javascript - 使用 ECMA 6 和 webpack 4 的自定义 Javascript 库
- vue.js - 我们可以从子组件更改 Vuejs 全局属性吗
- c++ - C++ 长错误消息我无法解决
- java - Jersey:LogginFeature 记录在哪里?
- ruby-on-rails - 如何使用 searchkick 设置 word_middle 区分大小写的搜索?
- python - 是否存在无法通过 Selenium 自动化的页面?
- c++ - 我的程序没有为指数/逆对数变换提供所需的输出
- bitbucket - 如何从 Jira 转换在 Bitbucket 中创建拉取请求?
- python - 如何从 statsmodels MANOVA 中获取 pvalue?
- wordpress - Gravity Forms - 使用来自另一个表单的数据填充字段