【问题标题】:Native DLL in LINQPadLINQPad 中的本机 DLL
【发布时间】:2018-09-25 18:07:45
【问题描述】:

我引用的是 NuGet 包 ABCpdf,它提供了一个托管 DLL abcpdf.dll 和四对本机 DLL,采用 x86 和 x64 类型:

packages\ABCpdf\11.2.2\build\PrintHook64.dll
packages\ABCpdf\11.2.2\build\3DGlue11-32.dll
packages\ABCpdf\11.2.2\build\3DGlue11-64.dll
packages\ABCpdf\11.2.2\build\ABCpdf11-32.dll
packages\ABCpdf\11.2.2\build\ABCpdf11-64.dll
packages\ABCpdf\11.2.2\build\ChakraCore32.dll
packages\ABCpdf\11.2.2\build\ChakraCore64.dll
packages\ABCpdf\11.2.2\build\PrintHook32.dll

在需要其中一个或多个 DLL 的 LinqPad 中运行的查询会失败,除非我按照 LINQPad 作者 @joe-albahari 的建议 here 手动将所有这些 DLL 复制到 %PROGRAMFILES%\LINQPad5

那是在 2016 年。2018 年有没有更自动化的方式?

我尝试在查询属性中添加对本机 DLL 的引用;会产生这个错误

CS0009 Metadata file '..\ABCpdf11-64.dll' could not be opened -- PE image doesn't contain managed metadata.

我尝试使用 将所有非框架引用复制到单个本地文件夹 选项,听起来就像是专为这种情况而设计的。不幸的是,这也不起作用。还是有这个错误

DllNotFoundException: Unable to load DLL 'ABCpdf11-32.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

【问题讨论】:

    标签: linqpad


    【解决方案1】:

    我相信与 Visual Studio 不同的是,Linqpad 没有“构建”步骤,而是将引用的程序集动态加载到 Linqpad 进程中。结果是 Linqpad 无法运行通常作为包安装的一部分安装的其他构建任务,然后可以在构建阶段由 MSBuild 进程运行。我不能 100% 确定这是否是这里发生的事情,但如果您的 VS 项目运行良好,那么这似乎是可能的原因。

    理论上,我在这里 100% 推测,对这些软件包的支持可以添加到 Linqpad,但是,我在这里是修辞,它是否值得 em> 它(来自软件经济学 PoV),或者它甚至是正确的解决方案?我什至认为包作者在这方面有更多发言权。

    无论如何,可能有一种方法可以自己做(这将是一个肮脏的黑客)。在 NuGet 包中,托管库可以在包的 lib 文件夹下的相应框架文件夹中找到,如果它们还需要本机 DLL,从技术上讲,它们应该也捆绑在同一个文件夹,以及托管文件夹。

    因此,您在这里可能还有其他一些选择:您可以尝试询问软件包作者,看看他们是否愿意复制并在其软件包中包含本机 DLL 以及托管DLL,这样可以解决您的问题(这是理想的情况!)

    或者,如果您是 DIY 类型的人并且愿意在这方面花费更多时间,那么您可能可以编写一个脚本/应用程序来自动为您执行此操作并在本地保存一个新包。然后,您所要做的就是引用该本地包。

    【讨论】:

    • 谢谢。自从这个问题在 2018 年发布以来,我已经换了两次工作,我现在的雇主确实在一些事情上使用 ABCPDF,但不像我的老雇主那样广泛使用。这个包没有把非框架DLLs放在lib子文件夹中;它们仅存在于build 子文件夹中。我会联系供应商,看看他们是否会改变(或者他们是否有理由);在添加 nuget 后,我​​还将尝试手动将它们复制到 lib 子文件夹。这样做,即使是手动的,“感觉”比将它们复制到 %PROGRAMFILES%\LINQPad5 更好。
    • 不幸的是,它不起作用——既没有构建我自己的nupkg,也没有将文件复制到提取的liblib\net40 文件夹中。所以,我会继续使用%PROGRAMFILES%\LINQPad5
    • 你的 LinqPad 是什么版本的?什么是包版本?当我尝试使用最新的 ABCPDF 包时,它确实对我有用。
    • 我有 LINQPad 5.43.00 ... 检查更新说我有最新版本(测试版除外)。
    • 谢谢罗斯,你能告诉我你正在使用的 Nuget 包的版本吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多