【问题标题】:Resolve an C++ assembly in C#在 C# 中解析 C++ 程序集
【发布时间】:2020-05-12 10:41:58
【问题描述】:

我有一个 C# WPF 项目,我需要在其中添加一些 c++ dll 以使用其中实现的功能。 如果我直接使用

MyClassinDll myc = new MyClassinDll();

我得到多个未解析文件未找到异常,dll 的作者建议我使用

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);

加载 C++ dll,因为该 c++ dll 具有其他 c++ dll 作为依赖项。

是否可以使用C++ dll 类,无需反射的函数?

并像 mvc.MyMethod(a,b,c) 一样直接使用它,因为反射需要时间和复杂的参考?

【问题讨论】:

    标签: c# c++ dll .net-assembly assembly-resolution


    【解决方案1】:

    我假设 MyClassinDll 是在您有静态引用的托管 dll 中定义的。如果此文件未加载,可能的解释是它依赖于无法加载的其他非托管 dll 文件。反射不能解决这个问题,因为代码仍然必须以某种方式加载。

    如果要加载非托管 dll,通常会使用 dllImport

    编辑: 非托管 dll 由链接器根据 search order 加载。第一个位置通常是“加载应用程序的目录”。问题通常是找出缺少哪些 dll

    可能的候选者是VS c++ runtime,它应该与您正在使用的库一起打包。对于本机依赖项,​​查找丢失的 dll 有点复杂。经典工具是dependency walker,但还有其他工具。也可以使用process monitor to find failed resolutions。或者请库的供应商提供库的正确安装和使用说明。在联系供应商时,确切地知道缺少哪些 dll 会有所帮助,但这不是必需的。如果需要,请求一个使用该库的最小应用程序来证明它的工作原理。

    请注意,在处理程序集和 dll 时,只有“本机”和“托管”区别是相关的。 C++ 可用于编写托管程序集或本机程序集。因此,它有助于具体化。

    【讨论】:

    • MyClassinDll 是托管的,但它只是暴露了用非托管 c++ 编写的函数的名称,这些函数引用了 MyClassinDll ,并且由于我无法添加对这些非托管 c++ 的引用,我不确定应该我问作家一些具体的事情,我不擅长 C++
    猜你喜欢
    • 2012-06-11
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多