0

我一直在尝试签署程序集并收到此错误:

“Utils.Connection”没有实现接口成员“Interfaces.IConnection.BugFactory()”。“Utils.Connection.BugFactory()”无法实现“Interfaces.IConnection.BugFactory()”,因为它没有匹配的返回类型“ThirdPartyLibrary.BugFactory”。

那个错误看起来像一个肮脏,肮脏的谎言!在Utils.Connection,我有这个方法:

public new BugFactory BugFactory()

我不认为new关键字是问题,因为 1)删除它不会停止错误,2)我在另一个实现不使用关键字的类时遇到IConnection同样new错误 。更新: 如果我使用,override而不是new,我得到这个错误:

'Utils.Connection.BugFactory()':无法覆盖,因为 'ThirdPartyLibrary.ConnectionClass.BugFactory' 不是函数

这是因为ThirdPartyLibrary.ConnectionClass.BugFactory是一个属性。

只有一个BugFactory类,因此接口需要BugFactory与方法返回的返回类型不同的返回类型不是问题。即使我明确地将我的方法标记为返回ThirdPartyLibrary.BugFactory,当我尝试对UtilsDLL 进行强命名时,我仍然会收到错误消息。

这可能ThirdPartyLibrary是不符合 CLS 的旧 COM 库的结果吗?我无法控制这个库。当我尝试签署Utils程序集时,我没有收到接口错误。

我的大问题是:我如何签署这个程序集?

编辑:这里有什么IConnection

using ThirdPartyLibrary; // The only using statement
namespace Interfaces
{
   public interface IConnection
   {
       ...
       BugFactory BugFactory();
   }
}
4

4 回答 4

3

我仍然怀疑new这个错误的关键字。

你说“我不认为 new 关键字是问题,因为 1)删除它并不能停止错误”,但你必须记住,如果你的方法隐藏了一个基本方法,编译器会添加一个new,即使您不指定它,除非您明确指定override

显式new所做的只是防止编译器警告(不是错误)。

真的有隐藏或覆盖的方法吗?

如果您指定virtual而不是new使用此方法会发生什么。它编译吗?它是否因“找不到合适的方法来覆盖”而出错?

[编辑以回应您的评论]

我收到此错误:“'Utils.Connection.BugFactory()':无法覆盖,因为 'ThirdPartyLibrary.ConnectionClass.BugFactory' 不是函数。” 原来的 ThirdPartyLibrary.ConnectionClass.BugFactory 是一个属性。

我怀疑这可能是问题所在。您正在使用方法覆盖属性。

通过使用 new 关键字,您将旧属性隐藏给任何引用您的派生类的人。

相比之下,将引用转换为超类(您从中继承的那个)的任何人,他们将看到旧属性,而不是您的新方法。

您能否提供更多超类(或接口)的代码以及派生类?

[编辑以回应您的评论]

我正在尝试更改接口以使 BugFactory 成为属性而不是方法

new 的问题在于它看起来有点神奇,可以让你改变参数类型和返回类型,但它确实是纯粹的邪恶。

它不会更改代码的所有使用者的类型,而是仅针对被强制转换为覆盖新类型的使用者进行更改。这使您处于可怕的境地,即同一实例的两个消费者将看到不同的签名,具体取决于它们的投射方式。

看看您是否可以识别出抱怨的消费代码,并考虑是否需要更改更多代码以支持类型更改。此外,您是否有可能尝试做一些“有点讨厌的黑客”的事情?

于 2010-01-05T16:35:10.143 回答
1

命名空间/版本问题?

如果您以某种方式引用了第三方程序集的两个不同版本,ThirdPartyLibrary.BugFactory 可能是不同的类型:一个在编译时,另一个在您签名/验证时。

于 2010-01-05T16:26:51.507 回答
1

听起来您只是通过“添加引用”对话框引用 COM 库。您可能应该为可以签名的 COM 库创建一个主互操作程序集。对程序集进行签名的警告之一是它引用的所有程序集也必须进行签名。

您通常会使用 SDK 程序 TlbImp:

TlbImp yourcomlibrary.tlb /primary /keyfile:yourkeyfile.snk /out:yourcomlibrary.dll

于 2010-01-05T17:15:11.937 回答
0

你的IConnection界面是什么样的?似乎您ThirdPartyLibrary有一个对象,并且您的项目或其他参考中BugFactory也有一个对象。BugFactory您是否尝试将接口和具体类型都更改为明确ThirdPartyLibrary.BugFactory用作该方法的返回类型?

于 2010-01-05T16:30:41.103 回答