如何解决“请确保文件可访问并且它是有效的程序集或COM组件”的问题?
本文关键字:程序集 有效 COM 问题 组件 解决 何解决 访问 文件 确保 | 更新日期: 2023-09-27 18:05:40
我正在用c#构建一个OpenCV项目。它需要一个名为cvextern.dll
的dll文件。但是,当将此文件添加为引用时,会出现以下消息:-
不能添加引用"cvextern.dll",请确保该文件是可访问的,并且它是一个有效的程序集或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