2017-03-02 22 views
0

我从SourceForge下载了一个包,文件号为PlanEph,它有64位和32位的C#DLL。通过将DLL放入我的bin/Debug目录(我使用Visual Studio 2015社区)并添加该DLL作为参考,我获得了包含32位C#演示的工作。不可预测的系统.DllNotFoundException

然后我尝试在单独的解决方案中制作自己的演示版本,并且得到了System.DllNotFoundException。各种各样的实验让我相信我的Visual Studio安装中的任何位置都不能有两个相同的命名空间名称,所以我删除了所有内容并重新开始。

我做了一个目录C \ GJAbin,把它放入DLL中,并将它添加到系统路径变量中。我还在该目录中添加了helloWorld类型的程序,并从命令行执行它以验证目录是否真的在路径中。然后我重新创建演示解决方案,将DLL添加为资源,并“成功”构建解决方案。然后我运行它并得到System.DllNotFoundException。

所以我不明白为什么在编译时发现DLL,而不是在运行时。

+0

它可能是.net框架版本的问题,您应该检查您的新项目.net框架版本是否与包版本相同或更高 –

+0

如果.net框架版本错误,它将无法正常工作。既然它工作过一次,我相信框架版本是可以的。此外,Visual Studio今年重新安装。 –

回答

0

转到项目设置,转到“发布”选项卡和最上面的按钮(标记为“应用程序文件”)。如果您没有看到您的DLL,请选择“显示所有文件”复选框。将DLL的发布状态设置为“Include”(不包括“Include(Auto)”!!)并再次发布。

现在,DLL应该位于发布文件夹中。

+0

对不起,您的描述不够具体,我找不到您描述的复选框。请理解我对天文学的更多了解(这是该计划的主题),而不是Visual Studio。 –

+1

右键单击你的项目 - >属性 - >目标框架 –

+0

Sagi Levi,目标框架是4.5.2。我的理解是,如果我的程序的目标框架> = DLL的目标我应该没问题。正如我所说,它曾经工作过一次,那是昨天。 –

0

所以我不明白为什么在编译时发现DLL而不是在运行时。

在编译时查找程序集的方式不同于MSBuild,而不是运行时(CLR)。

在编译时,MSBuild具有它所知道的特定搜索路径,或者在大多数情况下,这样的情况下,项目文件中会有东西告诉MSBuild在哪里查找文件。通常<Reference>有一个<HintPath>

在运行时,CLR将尝试从其自己的一组众所周知的路径中找到程序集。它会查看您应用的配置文件(如果适用),然后查看全局程序集缓存(GAC),然后查看您应用的根目录。有关这方面的更多详细信息,请访问here

您可以告诉MSBuild将引用复制到构建输出目录(通常与运行时的应用程序根目录相同)。在VS中,您可以通过选择参考并查看“属性”工具窗口(或默认按F4)来执行此操作。将CopyLocal状态设置为True。在项目文件中,这将在<Reference>上添加<Private>True</Private>

您也可以使用gacutil工具将程序集添加到GAC,但如果您想与其他人共享您的应用程序,这确实会变得更加困难。通常最好将副本保留在应用程序根目录中。

如果它仍然无法正常工作,您还可以查看运行时如何查找此程序集的日志。 Windows SDK中的fuslogvw.exe工具(可以从VS命令提示符运行,并且位于%PATH%中)允许启用对程序集加载的日志记录。您需要能够以管理员身份运行此配置设置。

Settings from fuslogvw

正如你在截图中看到,您可以登录异常的结果(这样你可以看到它在调试时),或者你可以将其记录到磁盘上的文件(这样你就可以看到它)。

+0

我检查了复制本地,它已经真正。我发现dll出现在我的... \ Projects \ Demo32 \ Demo32 \ bin \ Debug中,所以为了确保,我摆脱了它并再次运行构建。果然,在... \ bin \ Debug中有一个新的dll副本。我稍后再看fuslogvw。 –

+0

所以我尝试记录到一个文件,并得到一个.pdb文件,但不知道如何查看该类文件。 –

+0

如果您设置自定义日志路径(应该是一个文件夹),您应该在那里获取正确的文件。就我个人而言,我使用异常文本并在调试器中查看它。 * .pdb文件是可执行文件的调试符号,它们不是您要查找的日志文件。 – Jimmy

0

问题原来是作者选择名称和Visual Studio显示信息和错误消息的方式之间的一种不幸的交互。作者创建了一个包含命名空间PlanEph32的c#dll Astronomy.PlanEph32.dll,该命名空间实际上只是c dll PlanEph32.dll的一个包装。所以关于无法加载PlanEph32.dll的所有错误消息都指的是找不到c DLL; c#dll被发现很好。