LINQPad中的本机DLL

时间:2018-09-25 18:07:45

标签: linqpad

我引用的是NuGet软件包ABCpdf,它提供了x86和x64品种的托管DLL abcpdf.dll和四对本机DLL:

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

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

那是在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)

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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