我从SourceForge下载了一个包,PlanEph,它有64位和32位的C#DLL。通过将DLL放入我的bin / Debug目录(我使用Visual Studio 2015社区)并添加DLL作为参考,我得到了32位C#demo。
然后我尝试在单独的解决方案中创建自己的演示版本,并获得System.DllNotFoundException。各种实验让我相信我在Visual Studio安装中的任何地方都没有两个相同的命名空间名称,因此我删除了所有内容并重新开始。
我创建了一个目录C \ GJAbin,将DLL放入其中,并将其添加到系统Path变量中。我还在该目录中放置了一个helloWorld类型的程序,并从命令行执行它以验证该目录是否真正在路径中。然后我重新创建了演示解决方案,将DLL添加为资源,并成功构建了解决方案"。然后我运行它并获得System.DllNotFoundException。
所以我无法理解为什么在编译时找到DLL而不是在运行时。
答案 0 :(得分:0)
转到项目设置,转到“发布”标签和最顶部的按钮(标记为“应用程序文件”)。如果没有看到您的DLL,请选中“显示所有文件”复选框。将DLL的发布状态设置为“Include”(不是“Include(Auto)”!!)并再次发布。
现在DLL应该在发布文件夹中。
答案 1 :(得分:0)
所以我无法理解为什么在编译时找到DLL而不是在运行时。
在编译时定位程序集(通过MSBuild)与在运行时(通过CLR)不同。
在编译时,MSBuild具有它所知道的特定搜索路径,或者在大多数情况下,这样,项目文件中会有一些内容告诉MSBuild在哪里查找文件。通常<Reference>
有一个<HintPath>
。
在运行时,CLR将尝试从其自己的一组众所周知的路径中查找程序集。它将在您的应用程序的配置文件(如果适用)中查找,然后在全局程序集缓存(GAC)中,然后在您的应用程序的根目录中。有关详细信息,请参阅here。
您可以告诉MSBuild将引用复制到构建输出目录(通常与运行时的应用程序根目录相同)。在VS中,您可以通过选择引用并查看“属性”工具窗口(或默认情况下按 F4 )来执行此操作。将CopyLocal状态设置为True。在项目文件中,这会在<Private>True</Private>
上添加<Reference>
。
您还可以使用gacutil
工具将程序集添加到GAC,但如果您想与其他人共享您的应用程序,这会更加困难。通常最好在您的应用程序根目录中保留一份副本。
如果它仍然不起作用,您还可以查看运行时尝试查找此程序集的日志。 Windows SDK中的fuslogvw.exe
工具(您可以从VS命令提示符运行它,它将位于%PATH%上)允许您启用程序集加载的日志记录。您需要能够以管理员身份运行此配置设置。
正如您在屏幕截图中看到的,您可以在异常中记录结果(以便在调试时可以看到它),或者您可以将其记录到磁盘上的文件中(因此您可以看到它)。
答案 2 :(得分:0)
问题结果是作者选择名称的方式与Visual Studio显示信息和错误消息的方式之间的不幸交互。作者创建了一个包含命名空间PlanEph32的c#dll Astronomy.PlanEph32.dll,它实际上只是c dll PlanEph32.dll的包装器。所以关于无法加载PlanEph32.dll的所有错误消息都指的是没有找到c dll; c#dll被发现就好了。