【问题标题】:A reference to the dll could not be added无法添加对 dll 的引用
【发布时间】:2011-03-28 06:31:14
【问题描述】:

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

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

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

模块“”已加载,但对 DLLRegisterServer 的调用失败 错误代码'0x80004005'

我在 64 位 Windows 7 机器上使用 VS2010 终极版。可能是什么问题?

感谢任何提示/回复

【问题讨论】:

    标签: .net wcf reference


    【解决方案1】:

    以下内容对我有用:

    简答

    通过命令行(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 是 cvextern.dll。你可以运行:

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

    【讨论】:

    • 访问 TlbImp.exe 的另一种方法是打开 Visual Studio 命令提示符。
    • @Memet Afer 尝试这个我得到了,TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library. 有什么建议吗?
    • 输入文件 C:\Windows\SYSTEM32\SqlServerSpatial.dll' 不是有效的类型库
    • 与 Dineshkumar Ponnusamy 所述的错误相同。请帮帮我
    • 什么时候需要使用 TLBMP?通常在 VS2015 中,如果您只是从引用窗口中添加对 COM DLL 的引用,它会为您处理所有这些。
    【解决方案2】:

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

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

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

    2018 年 3 月 12 日更新: 指向 MSDN 杂志的链接不再像 2010 年 8 月那样有效。Jason Clark 的文章标题为“.NET 专栏:在 C# 中调用 Win32 DLL P/调用”。它发表在 2010 年 7 月的 MSDN 杂志上。 “回程机器”目前有文章here(格式有限)。整个 MSDN 杂志 2010 年 7 月一期可通过here 获得(仅限 HCM 格式,有关如何使用 HCM 文件的说明here)。

    【讨论】:

    • 有没有办法确保编译器将 .dll 放在输出文件夹中,即使它不是参考?
    • @KyleDelaney 我不认为编译器可以做到这一点。我会考虑将 copy 或 xcopy 命令放入项目/解决方案的 pre-build/post-build 事件中。虽然它是手动的,但通常参考不会经常更改,并且适当的测试套件应该可以捕获您忘记更新在构建前/构建后事件中执行的命令的情况。
    • 感谢您的回复!
    • 文章链接已失效。
    • @Roald 谢谢。是的,链接确实坏了。 Microsoft 仅在不同的 URL 处提供整个 MSDN 杂志问题的 HCM 格式。 Wayback Machine 也有一个 HTML 格式的文章的快照,具有一些简化的外观。我已经更新了答案以反映这一点,并且我还从我的答案中删除了损坏的链接。希望这会有所帮助。
    【解决方案3】:

    我使用dependency walker 来检查dll 的内部引用。原来它需要 VB 运行时 msvbvm60.dll,由于我的开发盒没有安装,我无法使用 regsvr32 注册它

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

    【讨论】:

    • 在我的例子中,我不得不删除我试图引用的项目的 obj 文件夹,然后我重新构建了项目。
    【解决方案4】:

    如果您尝试引用 x86 dll,请确保您的编译器设置为 x86...

    我遇到了类似的问题...如上所述,我在 Visual Studio 2012 中尝试使用 OLEDB 从我的 C# 代码访问 Excel 文件。

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

    在调试期间,我突然意识到我正在为 64 位编译但加载了 Office x86。即使我为 32 位加载了 Access 库,它也从未被应用程序使用...因此无法访问。

    这是我在 C# 中使用的:

    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strFilePath + ";Extended Properties='Excel 12.0 Xml;HDR=Yes'";

    ...我遇到了一个错误

    我将编译器切换到 x86 后,它就可以工作了

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        在我的项目中导入 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】:

          在构建解决方案期间我的电脑重新启动后,我遇到了这个问题。我的两个引用消失了,所以我不得不手动重建我的两个项目,然后我可以添加引用而不会出错。

          【讨论】:

            【解决方案8】:

            通常在 Visual Studio 2015 中,您应该从 Visual Studio 的模板将 dll 项目创建为 C++ -> CLR 项目,但您可以在事后从技术上启用它:

            关键属性称为Common Language Runtime Support 在您的项目配置中设置。它位于Configuration Properties > General > Common Language Runtime Support 下。

            执行此操作时,VS 可能不会更新“Target .NET Framework”选项(应该如此)。您可以通过卸载项目、编辑 your_project.xxproj 文件以及添加/更新Target .NET framework Version XML 标记来手动添加它。

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

            【讨论】:

              【解决方案9】:

              您不能添加对本机 DLL 的引用。但是您可以将它们包含在解决方案中(右键单击解决方案,选择“添加现有文件”),但除非您声明类似

              ,否则它们不会被引用
              [DllImport("...")]
              public static extern void MyFunction();
              

              也许有某种 wrapper DLL,您实际上正在引用它并且其中包含 DLL 导入。

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

              此问题是因为您尝试添加的程序集仅针对 x86x64 处理器架构进行编译。

              只需尝试在 Build -> Configuration Manager 中将 Target Platform 更改为 x86x64。。 p>

              【讨论】:

                【解决方案10】:

                我需要在配置管理器中将架构从 x64 更改为 x86,并将我的 32 位 dll(C 语言 - pcProxAPI.dll)复制到此创建的新文件夹中。这是“Sashus”@987654321 描述的步骤之上@。

                C:\Projects..\bin\x86\Debug

                【讨论】:

                • 这也是他给我的问题。
                • 但是如果默认不是x86也不是x64?但是....“任何 Cpu”出现了...?
                • codeproject.com/articles/1160645/… 复制 32 位 dll 的任何 cpu 都可以工作
                【解决方案11】:

                当我尝试将我刚刚用 C++ 编写的 dll 添加到我的新 C# 项目时,我遇到了同样的问题。原来我需要设置我的 dll 来自的 C++ 项目的属性:

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

                因为我想在其中使用这个 dll 的 C# 项目也是这样设置的(将相同的属性设置为 /clr)。

                【讨论】:

                【解决方案12】:

                我遇到了类似的问题。我试图将 .net 2.0 dll 的引用添加到 .Net 1.1 项目中。当我尝试添加在 .Net 1.1 中编译的以前版本的 .dll 时。它对我有用。

                【讨论】:

                  【解决方案13】:

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

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

                  一般而言,您必须绝对确定自己满足了提供参考的所有要求 - 我知道这是显而易见的答案,但您可能忽略了一个相对简单的要求。

                  【讨论】:

                  • 查看与参考相关的框架版本之间的差异 - 很多时候使用较新的框架版本应该不会产生影响。
                  【解决方案14】:

                  我在编写 Windows 服务时遇到了这个错误。我以管理员身份运行 Visual Studio,以便我的后期构建命令会自动安装我的服务。我注意到,当我关闭所有内容并正常运行 VS(不是以管理员身份)时,它让我添加引用就好了,没有错误。

                  希望此解决方案适合您。

                  【讨论】:

                    【解决方案15】:

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

                    在我的情况下,在更新引用另一个库的 nuget 库后导致问题消失了。

                    【讨论】:

                      【解决方案16】:

                      您可以手动添加 .dll 文件。例如,如果您想在 WPF 应用程序中添加一个 dll 文件,而您无法在项目中引用它

                      (出现错误:无法添加对“....dll”的引用。请确保该文件可访问并且它是有效的程序集或 COM 组件),

                      然后复制该 dll 文件并粘贴到 INSTALLER PROJECT(在应用程序文件夹中)。

                      【讨论】:

                        【解决方案17】:
                        1. 启动 cmd.exe 并输入:
                        2. Regsvr32 %dllpath%
                        3. "%dllpath%" 替换为您的 dll 路径

                        【讨论】:

                          【解决方案18】:

                          当我尝试将自己的 c++ dll 添加到 c# (4.7.2) 项目时遇到了同样的问题

                          c++ 项目编译为 x86 (win32) c#被编译为x86

                          解决方案是将 c++ 编译为 CLR

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2013-08-21
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2012-09-10
                            相关资源
                            最近更新 更多