强名称及其与引用程序集的关系
本文关键字:程序集 关系 引用 强名称 | 更新日期: 2023-09-27 18:32:38
这是我遇到的问题。我需要从 C# 中的两个类继承,这是无法做到的。因此,我将我的类设置为从一个类继承,并为另一个类实现一个接口。我先做了界面,一切正常。然后从类继承时开始出现问题。起初,它会编译,但在实现类时我会得到:
The assembly 'XXXXXXX'bin'x86'Debug'Resource.dll' does not have a strong name.
很简单,我签了我的项目。但是现在,在使用以前工作的引用进行构建时,我遇到了一个问题:
The type 'WPResourceEvtLib.IWPResourceEvt' is defined in an assembly that is not
referenced. You must add a reference to assembly 'Interop.WPResourceEvtLib,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=567474567455'
我有已经注册的WPResourceEvtLib.tlb,以及Interop.WPResourceEvtLib.dll,不应该是必需的。如果我将Interop.WPResourceEvtLib.dll添加到我得到的引用中:
Cannot embed interop type 'WPResourceEvtLib.tagWPResErrorType' found in both assembly
'XXXXXXX'Interop.WPResourceEvtLib.dll' and
'XXXXXXX'obj'x86'Debug'Interop.WPResourceEvtLib.dll'. Consider setting the 'Embed
Interop Types' property to false.
这是 .net3.5,所以没有"嵌入互操作类型"选项,但我确实在 cproj 文件中找到了这些选项 - 但它们什么也没做。我要么非常接近,要么我的实现完全错误。会是什么?
很抱歉大部分没有答案,但支持问题的数量变得很大,这样它就会更具可读性。
首先,XXXXXXX'bin'x86'Debug'Resource.dll
的性质/种类是什么?如果是.Net,那么为什么是TLB文件?是COM还是本机?还是 COM/OCX?或者只是一个带有某些 ComVisible 类型的普通 .Net 程序集?什么是WPResourceEvtLib
?是那个Resource.dll
的"名字"吗?
"当时",当您的程序集未签名时,一切正常?你到底改变了什么?哪个项目被签署,项目之间的关系/参考是什么?所有这些项目是否位于同一解决方案中,它们是否同时生成并且它们按同级项目引用,或者您可能单独构建某些部件并且仅按 GAC 引用,或者更糟糕的是,按路径引用到 DLL?可能只是您忘记刷新/重建一些引用,并且它们仍然链接到旧的未签名版本?
最后,为什么你认为你的继承和接口的实现导致了什么?您是否做了一些低级操作,例如手动编写 IL、COM 元数据等?继承/实现问题实际可能导致的唯一事情是强制您引用程序集 X 以获取基类的定义和程序集 Y 以获取接口定义的定义,仅此而已。它与签名或未签名无关。这一切都只是关于对正确程序集的引用。
让我们开始猜测。所以,回到参考文献。第一条错误消息告诉您,您的项目引用了使用另一个程序集 Y 的程序集 X,并且您的项目尝试使用属于 Y 的类/类型,但没有显式引用 Y(即,它从 X 程序集中偷看了它(。这是做不到的。当 T.dll 使用 X.dll 使用 Y.dll 时,每当 X.dll 从 T.dll 向客户端返回 Y 类型时,T.dll 必须引用 Y.dll否则将无法使用该 Y 对象。现在请注意更改:当未签名时,一切正常。所以你的项目"无符号T"使用了"无符号X",它使用了"无符号Y"。如果编译了,则意味着 T 同时引用了 X 和 Y。签名后,您收到错误,"签名 T"未引用"签名 Y"。 SEE 新签名的 Y 是如何做到的?如果它引用了它,那么错误就不会显示。因此,这意味着"有符号T"确实引用了"有符号X",而"符号X"确实引用了"有符号Y"。但是:由于错误声称已签名的 T 不引用已签名的 Y,这可能意味着已签名的 T 项目仍在引用旧的无符号 Y。现在,如果您实际添加对有符号 Y 的引用,您将获得类型冲突:在旧的无符号 Y 和新的有符号 Y 中可以看到相同的类型。
如果您按路径添加了从 T 到 Y.dll 的引用,并且忘记在该路径上重建该 Y.dll,则可能会发生这种情况。这可能真的很愚蠢:即在T中,您单击了"添加引用"和"浏览"并指向"Release''Y.dll",然后忘记重建它,只在DEBUG模式下重建T/X/Y。这样,一个旧的无符号版本将徘徊在缓存目录中,而 T 仍将尝试使用它,而引用的 X 将重新链接到新的有符号 Y。
您是否尝试过最简单的方法:清理所有内容,删除所有 bin/obj 文件夹,删除所有引用,重新添加引用并重建?