代码之家  ›  专栏  ›  技术社区  ›  user20358

无法添加对dll的引用

  •  86
  • user20358  · 技术社区  · 14 年前

    当我在C应用程序中添加.dll文件作为引用时,它显示一个错误:

    无法添加对“……dll”的引用。请确保 该文件是可访问的,并且是有效的程序集或COM 组件。

    ildisassembler说没有有效的clr头,所以我尝试使用regsvr32注册它,这给了我另一个错误:

    模块“”已加载,但对dllRegisterServer的调用失败,原因是 错误代码“0x80004005”

    我正在64位Windows7计算机上使用VS2010旗舰版。有什么问题?

    谢谢你的任何提示/回复

    15 回复  |  直到 6 年前
        1
  •  49
  •   Manfred    7 年前

    以下内容对我很有用:

    简短回答

    通过命令行(cmd)运行以下命令:

    TlbImp.exe cvextern.dll        //where cvextern.dll is your dll you want to fix.
    

    将为您创建有效的dll。

    更长的答案

    • 开放式CMD

    • 找到tlbimp.exe。可能位于c:\program files(x86)\microsoft sdks\windows\v7.0a\bin中。如果找不到它,请转到根文件夹(C:\或D:)并运行:

      dir tlbimp.exe /s              //this will locate the file.
      
    • 运行tlbimp.exe并将您的dll放在它后面。示例:如果您的dll是cveextern.dll。你可以运行:

      TlbImp.exe cvextern.dll
      
    • 在tlbimp.exe的同一文件夹中创建了一个新的dll。您可以在项目中使用它作为参考。
        2
  •  15
  •   Manfred    7 年前

    只有当项目是.NET程序集时,才能将dll(或exe)添加到项目中。如果不是,您将看到此错误消息。

    regsvr32还对dll中的结构和导出函数进行了某些假设。从我使用它已经有一段时间了,但它必须与注册COM服务器有关,所以某些入口点需要可用。如果regsvr32失败,则dll不提供这些入口点,并且dll不包含COM组件。

    使用该dll的唯一机会是像导入任何其他非.NET二进制文件一样导入它,例如使用某些win32 API时。有一篇旧的MSDN杂志文章可能会有所帮助。有关从何处获取文章的信息,请参阅以下更新。

    更新日期:2018年3月12日: 链接到msdn杂志不再像2010年8月那样有效。jason clark的文章标题是“.net column:calling win32 dlls in c with p/invoke”。它发表在2010年7月的《MSDN杂志》上。“回程机器”有这篇文章 here 目前(格式有限)。整个MSDN杂志2010年7月发行。 here (仅限HCM格式,有关如何使用HCM文件的说明 here )

        3
  •  12
  •   user20358    14 年前

    我使用DependencyWalker来检查DLL的内部引用。原来它需要vb runtime msvbvm60.dll,由于我的dev box没有安装,所以我无法使用regsvr32注册它。

    这似乎是我最初问题的答案。

        4
  •  6
  •   Olivier Jacot-Descombes    10 年前

    如果要引用x86 dll,请确保编译器设置为x86…

    我也有类似的问题…如上所述,尝试使用OLEDB从Visual Studio 2012中的“我的C代码”访问Excel文件。

    我不断地收到关于访问库无法访问的错误,但我知道我已经加载了它。

    在调试期间,我突然意识到我正在为64位编译,但是已经加载了OfficeX86。虽然我加载了32位的访问库,但它从未被应用程序使用…因此,这是不可接近的。

    以下是我在C中使用的内容:

    “provider=microsoft.ace.oledb.12.0;data source=”+strfilepath+“;extended properties='excel 12.0 xml;hdr=yes'”;

    …我出错了

    当我将编译器切换到x86时,它就工作了

        5
  •  2
  •   JeffB    10 年前

    我刚刚遇到了这个问题,在所有关于用命令提示修复它的解释之后,我发现如果您直接将它添加到项目中,那么您就可以在需要的每个页面上简单地包含库。

        6
  •  2
  •   Sashus    8 年前

    在我的项目中导入winscard.dll也有同样的问题。我处理直接从dll导入的问题,如下所示:

    [DllImport("winscard.dll")]
    public static extern int SCardEstablishContext(int dwScope, int pvReserved1, int pvReserved2, ref int phContext);
    
    [DllImport("winscard.dll")]
    public static extern int SCardReleaseContext(int phContext);
    

    您可以将其添加到单独的项目中,然后从主项目中添加引用。

        7
  •  1
  •   Leon Wolf    7 年前

    不能将引用添加到 本地的 动态链接库。但是,您可以将它们包括在解决方案中(右键单击解决方案,选择“添加现有文件”),但除非您声明类似

    [DllImport("...")]
    public static extern void MyFunction();
    

    也许有某种 包装器 动态链接库,您实际上正在引用它,其中包含动态链接库导入。

    有时,您可能引用包装程序dll,但仍然无法使程序运行,错误提示会建议您确保文件存在,并且所有依赖项都可用。

    此问题是因为您试图添加的程序集是目标程序集,并且仅针对 x86 X64 处理器体系结构。

    只需尝试将目标平台更改为 x86 X64 在里面 建造 -gt; 配置管理器 .

        8
  •  0
  •   user2623151    11 年前

    我也面临同样的问题。我试图将.NET 2.0 dll的引用添加到.NET 1.1项目中。当我试图添加.NET 1.1中编译的.dll的早期版本时。这对我很有效。

        9
  •  0
  •   Community CDub    7 年前

    对于寻求此问题帮助或遇到FileNotFoundException或FirstChanceException的其他人,请查看我的答案:

    A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll - windows phone

    总的来说,你必须绝对确定你满足了做参考的所有要求——我知道这是显而易见的答案,但你可能忽略了一个相对简单的要求。

        10
  •  0
  •   Rafal Cypcer    8 年前

    在构建解决方案的过程中,我的PC重新启动后出现了这个问题。我的两个引用消失了,所以我必须手动重建我的两个项目,然后我可以毫无错误地添加引用。

        11
  •  0
  •   Fütemire    8 年前

    我在编写Windows服务时出错。我以管理员身份运行Visual Studio,以便生成后命令自动安装我的服务。我注意到,当我关闭所有内容并正常运行vs(不是作为管理员)时,它允许我添加引用,但没有错误。

    希望这个解决方案对您有效。

        12
  •  0
  •   Aaron Hull    8 年前

    通常在VisualStudio 2015中,应该将VisualStudio的模板中的DLL项目作为C++& GT;CLR项目创建,但在技术上可以在事实之后启用它。

    关键属性被调用 Common Language Runtime Support 在项目的配置中设置。在下面找到的 Configuration Properties > General > Common Language Runtime Support .

    这样做时,vs可能不会更新“target.net framework”选项(就像它应该更新的那样)。您可以通过卸载项目、编辑您的\u project.xxproj文件以及添加/更新 Target .NET framework Version XML标签。

    对于一个示例,我建议创建一个新的解决方案,作为一个C++ CLR项目,并检查那里的XML,甚至可以将其分解,以确保没有什么非常重要的,这是不寻常的。

        13
  •  0
  •   boateng    7 年前

    我需要在配置管理器中将体系结构从x64更改为x86,并将我的32位dll(C语言-pcproxapi.dll)复制到创建的新文件夹中。这是在“萨修斯”描述的台阶上 below .

    C:\projects..\bin\x86\debug

        14
  •  0
  •   Martin Staufcik    7 年前

    我的回答有点晚,但作为一个快速测试,请确保您使用的是最新版本的库。

    在我的例子中,在更新了一个nuget库之后,这个库引用了另一个库,导致了这个问题消失了。

        15
  •  0
  •   LoukMouk    6 年前

    当我试图添加一个刚编码的dll时,我也遇到了同样的问题。结果发现我需要设置我的dll来自的项目的属性:

    • Configuration Properties\General\Common Language Runtime Support: /clr
    • Configuration Properties\C/C++\General\Common Language RunTime Support: /clr

    因为我想在其中使用这个dll的项目也被设置成那样(具有相同的属性设置为 /clr )