2013-09-25 137 views
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,whoch不应要求。如果我加入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这些选项文件 - 但他们什么也没做。我要么非常接近,要么在实施过程中完全错误。会是什么呢?

+0

您可能已经尝试过,清理并构建解决方案。 WPResourceEvtLib.IWPResourceEvt的版本是否为1.0.0.0,是否设置为使用特定版本? –

+0

你需要使用COM吗?您的任何代码是否以非.Net语言编写? – Jodrell

回答

0

对不起,大部分是不答复的,但支持问题的数量很大,这样它会更具可读性。

首先,XXXXXXX\bin\x86\Debug\Resource.dll的性质/种类是什么?如果.Net,那么为什么TLB文件?它是COM还是本地的?还是COM/OCX?或者只是一个正常的.Net程序集与一些ComVisible类型?什么是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 reffed X和Y.签名后你得到错误,“签署T”没有引用“签署Y”。 SEE是如何看待新签署的Y?如果它参考了它,那么错误就不会显示出来。因此,这意味着“有符号的T”确实引用了“有符号的X”,它确实引用了“有符号的Y”。但是:由于错误声称签名的T没有引用带符号的Y,这可能意味着签名的T项目仍然引用旧的未签名的Y。现在,如果实际添加对带符号Y的引用,则会得到一个类型冲突:在旧无符号Y和新带符号Y中将显示相同类型。嘿,一切似乎都适合。

它可能发生,如果你由路径添加从T到一个Y.dll参考,忘了重建Y.dll在这条道路。这可能非常愚蠢:即在T中,您单击了“添加引用”和“浏览”并指向“Release \ Y.dll”,然后忘记重新编译它,只在重新编译模式下重新生成T/X/Y 。这样,一个旧的未签名版本会留在缓存目录中,而T仍然会尝试使用它,而引用的X将已经重新链接到新的带符号Y.

你试过了最简单的事情:清理所有东西,删除所有bin/obj文件夹,删除所有引用,添加引用并重建?

相关问题