2012-01-09 94 views
6

我想在我的.NET项目中引用托管DLL,而不将其复制到我的输出目录中。所以,当我的程序运行时,它会从安装的位置运行DLL - 无论它在哪里。问题在于这个托管DLL调用非托管DLL。当我尝试引用受管DLL时,它会抛出一个FileNotFound Exception - Could not load file or assembly 'CharacterGen' or one of its dependencies. The system cannot find file specified。当我将输出设置为与我引用的DLL相同的目录时,一切正常。通常的解决方案是引用从另一个程序集中调用的DLL。但是,我无法从托管程序中引用非托管程序集。引用非托管程序集

有没有办法引用托管DLL调用非托管DLL?

+0

您是否熟悉GAC ..?如果你不想复制到bin文件夹然后创建一个单独的文件夹,但你仍然需要将该.dll复制到该文件夹​​,引用它们等。如果不是,你将不得不使用搜索路径做一些LoadFromAssebly代码为什么会你不想只将.dll复制到一个可以正确引用的位置..还有你想过创建一个MSI安装程序的方式,如果用户想要运行你的应用程序/设置它在一个不同的目录结构.. at至少他们可以做到这一点,相关的参考依赖关系将被处理。 – MethodMan 2012-01-09 19:21:57

+0

我对GAC不太熟悉,但是据我所知,程序集必须签名。我无法控制我所引用的DLL,因此我无法验证它们是否已签名。我想过一个安装程序,但我不想安装到用户的现有目录中,因为它不是我的程序目录,而是存在于我的客户机上的目录。如果没有其他的工作,这将是我的后备。 – XSL 2012-01-09 19:46:14

+1

GAC对引用非托管DLL没有用处。 – BrainSlugs83 2016-06-11 01:45:24

回答

14

如果你问如何获得Visual Studio中复制非托管的DLL到您的输出目录,你可以这样做:

  1. 添加非托管DLL作为项目中的文件或链接文件。 (右键单击项目 - >添加 - >现有文件,然后添加或添加为链接)。
  2. 在解决方案资源管理器中选择该文件。在属性窗口中设置生成操作来始终复制。
+2

不要忘记,非托管DLL本身可能需要其他非托管DLL。如果你忘记添加这些,你可能会得到完全相同的错误。如果您不确定依赖关系是什么,那么您可以使用依赖关系助手来帮助您。 – insipid 2012-01-09 20:04:35

+1

“复制,如果更新”更好。 – 2012-01-09 20:26:54

+0

谢谢!只是为了纠正你,复制总是不在“构建行动”之下,它在“复制到输出目录” – 2013-11-07 12:40:09

0

如果您的解决方案有一堆您正在构建的非托管C++ dll和一个或两个托管C#程序集,并且它们都需要位于同一个文件夹中,那么我发现将所有项目使用相同的输出目录是最容易管理的解决方案。 - 这样,如果项目稍后重新命名等等,它们仍然会在正确的位置结束,如果稍后添加新的项目,则不必知道需要添加哪些dll,您只需要将OutputPath设置为与其他项目完全相同。

为了达到此目的,我将OutputPath属性(对于所有配置和平台,对于每个项目)设置为$(SolutionDir)\bin\$(Configuration)

一般来说,我不包括在路径$(Platform),因为非托管项目,它的命名Win32和托管它的命名x86 - 但如果你真的需要平台分离,您可以在.csproj的做一些条件逻辑文件来创建具有所需值的新属性。

相关问题