如何解决“请确保文件可访问并且它是有效的程序集或COM组件”的问题?

本文关键字:程序集 有效 COM 问题 组件 解决 何解决 访问 文件 确保 | 更新日期: 2023-09-27 18:05:40

我正在用c#构建一个OpenCV项目。它需要一个名为cvextern.dll的dll文件。但是,当将此文件添加为引用时,会出现以下消息:-

不能添加引用"cvextern.dll",请确保该文件是可访问的,并且它是一个有效的程序集或COM组件。

我厌倦了搜索,我花了两天时间寻找解决这个问题的方法

如何解决“请确保文件可访问并且它是有效的程序集或COM组件”的问题?

该文件是一个本地DLL,这意味着您不能通过添加引用将其添加到。net项目中…您可以通过DllImport使用它(参见http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx)

在我的情况下,我必须注册。dll。

为此,以管理员权限打开cmd.exe(控制台),并键入:

regsvr32 "foo.dll"

确保在构建应用程序时将所需的dll导出(或手动复制)到bin文件夹。

'It'需要一个名为cvexternal .dll的dll文件。"它"可以是你自己的cs文件,也可以是你在项目中使用的其他第三方dll文件。

要在自己的cs文件中调用本机dll,请将dll复制到项目的根'lib目录中,并将其作为现有项添加。(添加-现有项目)并使用正确位置的Dllimport。

对于第三方,将本机库复制到第三方库所在的文件夹中,并将其作为现有项添加。

构建完成后,确保所需的dll出现在Build文件夹中。在某些情况下,它可能不会出现或在构建文件夹中被替换。手动删除Build文件夹,然后重新构建。

我也有同样的程序,希望这能帮到你。

如果您使用的是Windows 7,打开命令提示符->以管理员身份运行。注册你的<…>.dll。

为什么以管理员身份运行,你可以在Windows开始运行时注册<…>.dll,但是即使你的帐户是管理员,你的dll仍然只能以用户身份运行。

现在您可以在Project-> add Reference->Browse中添加<…>.dll

谢谢

查看TheMattster的答案。我实施了它,效果很好。简而言之,他的解决方案建议将COM dll作为项目的资源添加到项目中(所以现在它编译成项目的dll),并在第一次运行时将其写入文件(即我首先想要的dll文件)。

以下摘自他的回答。

步骤1)将DLL添加为资源(下面为"Resources.DllFile")。要做到这一点,打开项目属性,选择资源选项卡,选择"添加现有文件",并将DLL添加为资源。

步骤2)将DLL的名称添加为字符串资源(下面为"Resources.DllName")。

步骤3)添加以下代码到你的主表单加载:

if (!File.Exists(Properties.Resources.DllName))
{
    var outStream = new StreamWriter(Properties.Resources.DllName, false);
    var binStream = new BinaryWriter(outStream.BaseStream);
    binStream.Write(Properties.Resources.DllFile);
    binStream.Close();
}

我的问题是,不仅我必须在我的项目中使用COM dll,我还必须使用ClickOnce与我的应用程序一起部署它,并且不能在我的项目中添加对它的引用,上述解决方案实际上是唯一有效的。

在我的情况下,我也有非托管的dll (c++)在工作空间,如果你指定:

<files>
    <file src="bin'*.dll" target="lib" />
</files>

nuget会尝试将每个dll作为程序集加载,甚至包括c++库!为了避免这种情况使用references标签显式定义c#程序集:

<references>
    <reference file="Managed1.dll" />
    <reference file="Managed2.dll" />
</references>

备注:根据文档,父引用是元数据->https://learn.microsoft.com/en-us/nuget/reference/nuspec general-form-and-schema

文档:https://learn.microsoft.com/en-us/nuget/reference/nuspec