0

アセンブリに署名しようとして、次のエラーが発生しました。

「Utils.Connection」はインターフェイス メンバー「Interfaces.IConnection.BugFactory()」を実装していません。'Utils.Connection.BugFactory()' は 'Interfaces.IConnection.BugFactory()' を実装できません。'ThirdPartyLibrary.BugFactory' の一致する戻り値の型がないためです。

そのエラーは汚い、汚い嘘のように見えます! ではUtils.Connection、次の方法があります。

public new BugFactory BugFactory()

new1) キーワードを削除してもエラーが止まらず、2)キーワードを使用IConnectionない別のクラスで同じエラーが発生しているため、キーワードは問題ではないと思いますnew更新:overrideの代わり に使用するとnew、次のエラーが発生します。

'Utils.Connection.BugFactory()': 'ThirdPartyLibrary.ConnectionClass.BugFactory' は関数ではないためオーバーライドできません

これはThirdPartyLibrary.ConnectionClass.BugFactoryプロパティだからです。

クラスは 1 つしかないため、メソッドが返すものBugFactoryとは異なる戻り値の型を必要とするインターフェイスの問題ではありません。BugFactoryメソッドを return として明示的にマークしても、 DLLに厳密ThirdPartyLibrary.BugFactoryな名前を付けようとするとエラーが発生します。Utils

ThirdPartyLibraryこれは、CLS に準拠していない古い COM ライブラリの結果でしょうか? 私はこのライブラリを制御できません。アセンブリに署名しようとしないUtilsと、インターフェイス エラーは発生しません。

私の大きな質問は、このアセンブリに署名するにはどうすればよいですか?

編集:ここにあるものIConnectionがあります:

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

4 に答える 4

3

newこのエラーのキーワードはまだ疑わしいです。

「新しいキーワードは問題ではないと思います。なぜなら、1) 削除してもエラーが止まらないからです」とあなたは言いますが、メソッドが基本メソッドを隠している場合、コンパイラはnew.代わりに明示的に指定しない限り、指定しませんoverride

明示的にnew行うことは、(エラーではなく) コンパイラの警告を防ぐことだけです。

非表示またはオーバーライドする方法は本当にありますか?

このメソッドvirtualの代わりに指定するとどうなりますか。newそれはコンパイルされますか?「オーバーライドする適切なメソッドが見つかりません」というエラーが表示されますか?

[コメントに応じて編集]

「'Utils.Connection.BugFactory()': 'ThirdPartyLibrary.ConnectionClass.BugFactory' は関数ではないためオーバーライドできません。」元の ThirdPartyLibrary.ConnectionClass.BugFactory はプロパティです。

これが問題ではないかと思います。メソッドでプロパティをオーバーライドしています。

new キーワードを使用することで、派生クラスへの参照を持っている人に古いプロパティを隠します。

対照的に、スーパークラス (継承元) として参照キャストを持っている人は、新しいメソッドではなく、古いプロパティを参照します。

派生クラスと一緒にスーパークラス (またはインターフェイス) のコードをもう少し教えてもらえますか?

[コメントに応じて編集]

BugFactory がメソッドではなくプロパティになるようにインターフェイスを変更しようとしています

new の問題は、引数の型と戻り値の型を変更できるちょっとした魔法のように思えることですが、実際には純粋な悪です。

コードのすべてのコンシューマーの型を変更する代わりに、オーバーライドする新しい型としてキャストされたコンシューマーに対してのみ変更を行います。これにより、同じインスタンスに対する2 つのコンシューマーが、キャスト方法に応じて異なるシグネチャーを参照するという恐ろしい状況に陥ります。

問題を起こしている消費コードを特定できるかどうかを確認し、型の変更をサポートするためにコードをさらに変更する必要があるかどうかを検討してください。また、「ちょっと厄介なハック」をしようとしている可能性はありますか?

于 2010-01-05T16:35:10.143 に答える
1

[参照の追加] ダイアログで COM ライブラリを参照しているだけのようです。おそらく、署名可能な COM ライブラリのプライマリ相互運用機能アセンブリを作成する必要があります。アセンブリに署名する際の注意事項の 1 つは、アセンブリが参照するすべてのアセンブリにも署名する必要があるということです。

通常、SDK プログラム TlbImp を使用します。

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

于 2010-01-05T17:15:11.937 に答える
1

名前空間/バージョンの問題?

ThirdPartyLibrary.BugFactory は、何らかの形で参照されているサードパーティ アセンブリの 2 つの異なるバージョンがある場合、異なるタイプである可能性があります。1 つはコンパイル時、もう 1 つは署名/検証時です。

于 2010-01-05T16:26:51.507 に答える
0

あなたのIConnectionインターフェースはどのように見えますか?あなたThirdPartyLibraryにはBugFactoryオブジェクトがありBugFactory、プロジェクトまたは別の参照にもオブジェクトがあるようです。インターフェイスと具象型の両方を、ThirdPartyLibrary.BugFactoryそのメソッドの戻り型として明示的に使用するように変更してみましたか?

于 2010-01-05T16:30:41.103 に答える