2010-01-05 3 views
0

Я пытался подписать сборку и получить эту ошибку:интерфейс не реализована ошибка при подписании C# сборки

'Utils.Connection' does not implement interface member 'Interfaces.IConnection.BugFactory()'. 'Utils.Connection.BugFactory()' cannot implement 'Interfaces.IConnection.BugFactory()' because it does not have the matching return type of 'ThirdPartyLibrary.BugFactory'.

Эта ошибка выглядит как грязная, грязная ложь! В Utils.Connection, у меня есть этот метод:

public new BugFactory BugFactory() 

Я не думаю, что new ключевое слово является проблемой, потому что 1) удаление его не остановить ошибку и 2) У меня такая же ошибка с другим классом который реализует IConnection, который делает не ключевое слово new. Update: если я использую override вместо new, я получаю эту ошибку:

'Utils.Connection.BugFactory()': cannot override because 'ThirdPartyLibrary.ConnectionClass.BugFactory' is not a function

Это потому, что ThirdPartyLibrary.ConnectionClass.BugFactory является свойством.

Существует только один класс BugFactory, поэтому это не проблема интерфейса, требующего другого типа возвращаемого типа BugFactory, чем возвращаемого метода. Даже если я явно отмечу мой метод как возвращающий ThirdPartyLibrary.BugFactory, я все равно получаю сообщение об ошибке, когда пытаюсь прочно назвать Utils DLL.

Может ли это быть результатом ThirdPartyLibrary, являющегося старой библиотекой COM, не совместимой с CLS? Я не контролирую эту библиотеку. Когда я делаю не попытаться подписать сборку Utils, я не получаю ошибку интерфейса.

Мой большой вопрос: как я могу подписать эту сборку?

Edit: вот что IConnection есть: проблемы

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

@Sarah - вы докопаться до этого? Ник считает, что мой ответ вполне может быть на правильном пути, и он может быть прав, поэтому мне (мы оба!) Было бы интересно узнать, нашли ли вы основную причину, Та. –

+0

Моя коллега и я оба работали над этой проблемой, и мы до сих пор не нашли решения. :( –

+0

Возможно, стоит попробовать ответить Нику, если вы еще этого не сделали. Удачи в решении проблемы. –

ответ

1

пространство имен/версия?

ThirdPartyLibrary.BugFactory может быть другого типа, если у вас есть две разные версии сборки 3 партии которые ссылаются как-то: один во время компиляции и другой один, когда вы подписываете/проверить ..

+0

Когда я проверяю свойства Reference в каждом проекте ('Connection' находится в' Utils', 'IConnection' находится в «Интерфейсы»), они ссылаются на одну и ту же «ThirdPartyLibrary» (по крайней мере, совпадают поля «Identity»). –

0

Что делает ваш IConnection интерфейс выглядит? Кажется, что у вашего ThirdPartyLibrary есть объект BugFactory, и у вас также есть объект BugFactory либо в вашем проекте, либо в другом месте. Вы пытались изменить как интерфейс, так и конкретный тип на использование экспликации ThirdPartyLibrary.BugFactory в качестве возвращаемого типа для этого метода?

+0

Обновленный вопрос для предоставления сведений о IConnection. Явное описание 'ThirdPartyLibrary.BugFactory' как интерфейса, так и класса это не сработало. :( –

3

Я по-прежнему подозреваю ключевое слово new для этой ошибки.

Вы говорите: «Я не думаю, что новое ключевое слово является проблемой, потому что 1) удаление его не останавливает ошибку», но вы должны помнить, что если ваш метод скрывает базовый метод, компилятор добавит a new, даже если вы не укажете его, если только вы не указали вместо override.

Все явные ошибки new - это предупреждение о компиляторе (а не ошибка).

Есть ли вообще способ скрыть или переопределить?

Что произойдет, если вы укажете virtual вместо new по этому методу. Скомпилирует ли он? Ошибочно ли это, если «подходящий метод не найден, чтобы переопределить?»

[Edit в ответ на ваш комментарий]

I get this error: "'Utils.Connection.BugFactory()': cannot override because 'ThirdPartyLibrary.ConnectionClass.BugFactory' is not a function." The original ThirdPartyLibrary.ConnectionClass.BugFactory is a property.

Я подозреваю, что это может быть проблемой. Вы переопределяете свойство методом.

С помощью нового ключевого слова вы скрываете старое свойство любому, у кого есть ссылка на ваш производный класс.

Напротив, любой, у кого есть ссылка, как суперкласс (тот, который вы наследуете), они будут видеть старое свойство, а не ваш новый метод.

Можете ли вы дать еще один код суперкласса (или интерфейса) вместе с производным классом?

[Edit в ответ на ваш комментарий]

I'm trying to change the interface to have BugFactory be a property instead of a method

Проблема с новым является то, что это кажется немного магии, что может позволить вам изменить типы аргументов и возвращаемые типы, но это на самом деле чистое зло.

Вместо того, чтобы изменять типы для всех потребителей кода, он делает это только для потребителей, которые отливаются в качестве основного нового типа. Это доставит вас в ужасное положение, где два покупателя в том же экземпляре будут видеть разные подписи в зависимости от того, как они будут показаны.

Посмотрите, можете ли вы идентифицировать код потребления, который жалуется, и подумайте над тем, нужно ли больше изменять код для поддержки изменений типа. Кроме того, есть ли вероятность, что вы пытаетесь сделать что-то, что является «немного неприятным взломом»?

+0

Я получаю эту ошибку: «'Utils.Connection.BugFactory()': не может переопределить, потому что 'ThirdPartyLibrary.ConnectionClass.BugFactory' не является функцией." Оригинальная 'ThirdPartyLibrary.ConnectionClass.BugFactory' является свойством. –

+0

'public virtual BugFactory BugFactory()' в 'Utils.Connection' компилируется отлично. 'public new virtual BugFactory BugFactory()' также отлично компилируется и избавляется от предупреждения компилятора о скрытии. –

+0

Я пытаюсь изменить интерфейс, чтобы 'BugFactory' являлся свойством вместо метода, чтобы он соответствовал исходному' BugFactory' в 'ThirdPartyLibrary'. –

1

Похоже, вы просто ссылаетесь на библиотеку COM через диалог Добавить ссылку. Вероятно, вы должны создать сборку первичного взаимодействия для библиотеки COM, которая может быть подписана. Одна из предостережений о подписании сборки заключается в том, что все ссылки, которые она ссылается, также должны быть подписаны.

Вы обычно использовать SDK программы TLBIMP:

TLBIMP yourcomlibrary.tlb/первичный /keyfile:yourkeyfile.snk /out:yourcomlibrary.dll