强名称,以及它们与引用程序集的关系

时间:2013-09-25 07:02:45

标签: c# .net reference

这是我遇到的问题。我需要继承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文件中找到了这些选项 - 但它们没有做任何事情。我要么非常接近,要么我的实施完全错了。它可能是什么?

1 个答案:

答案 0 :(得分: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使用X.dll使用Y.dll时,每当X.dll从T.dll向客户端返回Y类型时,T.dll必须引用Y.dll,否则它将无法使用那个Y-object。现在请注意更改:无符号时,一切正常。所以你的项目“unsigned T”使用了“unsigned X”,它使用了“unsigned Y”。如果编译,则意味着T对X和Y进行了重复。签名后出现错误,“签名T”不引用“签名Y”。怎么看新签约的Y?如果它参考了它,那么错误就不会显示出来。因此,这意味着“签名T”确实引用了“签名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文件夹,删除所有引用,添加引用并重建?