Используйте интерфейс из внешней сборки, помеченный как «внутренний» (C #) - PullRequest
0 голосов
/ 23 марта 2009

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

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

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

Ответы [ 4 ]

4 голосов
/ 23 марта 2009

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

2 голосов
/ 23 марта 2009

Используйте атрибут InternalsVisibleToAtt во внешней сборке, чтобы указать сборку, которой вы хотите предоставить внутренние типы.

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

1 голос
/ 23 марта 2009

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

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

Другие опции:

  • Разберите другую сборку, используя Отражатель и это классное дополнение, которое строит целый проект из сборка.
  • Поговорите с владельцем другой сборки и объясните свои потребности они
0 голосов
/ 23 марта 2009

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

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

[assembly: InternalsVisibleTo("YourAssembly")]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...