参考非托管程序集

时间:2012-01-09 19:18:32

标签: c# .net dll reference assemblies

我正在尝试在我的.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?

2 个答案:

答案 0 :(得分:16)

如果您询问如何让visual studio将非托管DLL复制到您的输出目录,您可以这样做:

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

答案 1 :(得分:1)

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

为实现这一目标,我将OutputPath属性(对于每个项目的所有配置和平台)设置为$(SolutionDir)\bin\$(Configuration)

通常,我不在路径中包含$(Platform),因为对于非托管项目,它的名称为Win32,而托管的名称为x86 - 但如果您确实需要平台隔离你可以在.csproj文件中做一些条件逻辑来创建一个具有所需值的新属性。