LINQPad中的本地DLL

15

我正在引用NuGet包ABCpdf,它提供了一个托管的DLLabcpdf.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

在 LinqPad 中运行需要以下 DLL 的查询将失败,除非我手动将所有这些 DLL 复制到 %PROGRAMFILES%\LINQPad5,正如 LINQPad 作者 @joe-albahari 在此处建议的那样:https://dev59.com/dJPea4cB1Zd3GeqP-RFT#34834789
这是在 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个回答

1
我认为与Visual Studio不同,Linqpad没有“构建”步骤,并动态加载引用的程序集到Linqpad进程中。这意味着Linqpad无法运行可能通常作为包安装的附加构建任务,这些任务可以在MSBuild过程中进行构建阶段运行。我不能百分之百确定这就是问题所在,但如果你的VS项目正常运行,那么这似乎是很可能的原因。
理论上,在Linqpad中支持这些包是可以添加的(我在这里100%推测),但是,从软件经济学的角度来看,这是否值得(值得)呢?或者这是否是正确的解决方案?我甚至会认为包作者在这方面有更多的发言权。
无论如何,可能有一种方法可以自己实现它(这将是一个肮脏的黑客)。在NuGet包中,托管库可以在包的lib文件夹下的各个框架文件夹中找到,如果它们还需要本地DLL,则从技术上讲,它们应该与托管库一起捆绑在同一个文件夹中。
所以,您可能还有其他几个选项:您可以尝试询问包作者,看看他们是否愿意在其包中复制并包含本机DLL和托管DLL,这将解决您的问题(这是理想情况!)
或者,如果您是DIY类型的人,并且愿意花费更多时间在此上,那么您可以编写一个脚本/应用程序,自动为您执行此操作并保存一个新的本地包。然后,您只需要引用该本地包即可。

1
谢谢。自从这个问题在2018年发布以来,我已经换了两次工作,我的现任雇主确实使用ABCPDF进行一些工作,但远不如我的旧雇主那样广泛。该软件包不会将非框架DLL文件放入“lib”子文件夹中;它们只存在于“build”子文件夹中。我将联系供应商并查看他们是否会更改(或是否有理由);我还将尝试在添加nuget后手动将它们复制到“lib”子文件夹中。即使是手动操作,这样做也比将它们复制到“%PROGRAMFILES%\LINQPad5”中要好。 - Ross Presser
不幸的是,它没有起作用——无论是构建自己的nupkg,还是将文件复制到提取的liblib\net40文件夹中。因此,我将继续使用%PROGRAMFILES%\LINQPad5 - Ross Presser
你的LinqPad版本是多少?还有包版本呢?当我尝试使用最新的ABCPDF包时,它对我有效。 - Arca Artem
ABCpdf 12.1.0.5 - Ross Presser
1
@RossPresser 要注意的一件事是,默认情况下,LinqPad 5 不使用位于用户个人资料文件夹 %USERPROFILE%/.nuget 下的常规 NuGet 缓存。相反,它使用一个特定于 LinqPad 的缓存,如果您通过 NuGet 包管理导航,单击“设置”,然后选择“高级”选项卡,可以更改该缓存。在我的设置中,它的默认值为 %LocalAppData%\LINQPad\NuGet.FW46。我使用以下语句进行测试:var point = new WebSupergoo.ABCpdf.XPoint();。这会产生与您相同的错误。将 DLL 复制到相关文件夹后,它就可以正常运行了。 - Arca Artem
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接