0

这是我遇到的问题。我需要从 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 文件中找到了这些选项——尽管它们什么也没做。我要么非常接近,要么我的实施完全错误。会是什么呢?

4

1 回答 1

0

很抱歉大部分没有答案,但是支持问题的数量很大,这样它就会更具可读性。

首先,什么是性质/种类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 使用使用 Y.dll 的 X.dll 时,每当 X.dll 从 T.dll 返回一个 Y 类型给客户端时,T.dll 必须引用 Y.dll 否则它将无法使用那个 Y 对象。现在注意变化:当未签名时,一切正常。所以你的项目“unsigned T”使用了“unsigned X”,它使用了“unsigned Y”。如果已编译,则意味着 T 重新引用了 X 和 Y。签名后,您收到错误,“签名的 T”不引用“签名的 Y”。如何看到新签名的 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 文件夹,删除所有引用,重新添加引用并重建?

于 2013-09-25T07:44:50.097 回答