2009-03-23 2 views
0

Я хотел бы реализовать интерфейс, который находится во внешней сборке. Однако этот конкретный интерфейс был отмечен как «внутренний». Есть ли способ, которым я могу реализовать этот интерфейс для своих собственных классов?Используйте интерфейс из внешней сборки, помеченный как «внутренний» (C#)

Я знаю, как вызвать частные/внутренние методы, используя отражение в C#, поэтому я думаю, что отражение также должно использоваться в этом случае. Однако я не знаю, как это сделать. И да, я знаю, что обычно не разумно использовать внутренние/частные вещи, но в этом случае я не вижу другого решения.

Обновление: Я не могу редактировать/изменять внешний сбор в любом случае. Его следует оставить нетронутым.

ответ

4

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

+0

Я не хочу, чтобы редактировать/изменять внешний узел в любом случае. Я обновил вопрос. – LeonZandman

+0

Итак, вы очень жалели :) –

+0

Некоторые сложные решения включают в себя исправление исходной сборки с помощью Cecil, и если сборка подписана, деактивируйте ее проверку сильного имени, но это не тот путь, который я бы рекомендовал :) –

0

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

В основном все, что вам нужно будет сделать, это добавить следующий код в AssemblyInfo.cs код-файла в проекте:

[assembly: InternalsVisibleTo("YourAssembly")] 

Если YourAssembly сильно именем, то вы должны поместить полное имя сборки включая весь открытый ключ (а не только токен).

1

Для того, чтобы получить некоторый фон, предположительно, вы хотите передать реализацию интерфейса чему-то еще в этой сборке, которая также является внутренней, поскольку в противном случае они не смогли бы скомпилировать эту другую сборку (это ошибка обратитесь к внутреннему типу в параметрах публичного метода).

Я думаю, вам нужно будет использовать Reflection.Emit для создания типа, реализующего интерфейс, получив объект Type интерфейса путем отражения. Не совсем простая задача, и результат будет хрупким, потому что вы копаетесь во внутренних частях чужой сборки.

Других вариантов:

  • Разобрать другой узел, используя отражатель и что прохладную надстройку, что строит весь проект от сборки.
  • Поговорите с владельцем другого узла и объяснить ваши потребности их
+0

Да, я уже смотрел в Reflection.Emit. Интересные вещи :-) – LeonZandman

+0

Вы не можете использовать reflection.emit для реализации частного интерфейса, вы получите исключение TypeLoadException. –

+0

D'oh. Это, несомненно, хорошо. –

Смежные вопросы