【问题标题】:Reference unmanaged assembly引用非托管程序集
【发布时间】:2012-01-09 19:18:31
【问题描述】:

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

【问题讨论】:

  • 你熟悉GAC吗?如果您不想复制到 bin 文件夹中,则创建一个单独的文件夹,但您仍需要将 .dll 复制到该文件夹​​,引用它们等。如果不是,您将不得不使用搜索路径执行一些 LoadFromAssebly 代码为什么会您不想只是将 .dll 复制到可以正确引用的位置.. 如果用户想要运行您的应用程序/将其设置在不同的目录结构中,您是否考虑过以这种方式创建 MSI 安装程序.. 在至少他们可以做到这一点,并且相关的参考依赖将被处理..
  • 我对 GAC 不太熟悉,但据我了解,程序集必须签名。我无法控制我引用的 DLL,因此我无法验证它们是否已签名。我考虑了一个安装程序,但我不想安装到用户的现有目录中,因为它不是我的程序目录,它是存在于我客户机器上的目录。如果没有其他方法,那将是我的后备。
  • GAC 不能用于引用非托管 DLL。

标签: c# .net dll reference assemblies


【解决方案1】:

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

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

【讨论】:

  • 不要忘记非托管 DLL 本身可能需要其他非托管 DLL。如果您也忘记添加它们,您可能会得到完全相同的错误。如果您不确定依赖项是什么,可以使用依赖项遍历器来帮助您。
  • 谢谢!只是为了纠正您,始终复制不在“构建操作”下,而是在“复制到输出目录”下
【解决方案2】:

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

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

一般情况下,我不会在路径中包含$(Platform),因为对于非托管项目,它被命名为Win32,而对于托管项目,它被命名为x86——但如果你真的需要平台隔离,你可以做一些有条件的.csproj 文件中的逻辑以创建具有所需值的新属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 2015-09-24
    • 1970-01-01
    • 2013-01-07
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多