2010-06-27 6 views
3

Я работаю с assembly.CreateInstance, и возвращает нуль, в то время как это было прекрасно использовать его с другим проектом с тем же DLL файл «файлом сборка», Можете ли вы предложить причины, когда и почему он возвращает null? Пожалуйста, это срочно ??assembly.CreateInstance возвращает нулевое значение

Редактировать

Тип Я ищу имеет конструктор по умолчанию, но он реализует другой интерфейс, как это. Project1, имеет интерфейс A и делает DLL, которая содержит новый тип пусть будет TypeB, который реализует А. Project2, имеет один и тот же интерфейс A и использовать метод «CreateInstance», чтобы найти тип TypeB, но здесь CreateInstance возвращает нуль, какие-либо предложения?

+3

Вы действительно должны опубликовать код - очень сложно угадать эти вещи, не видя некоторых образцов кода. – Oded

+0

Если 'Project1' имеет интерфейс A", а 'Project2'" имеет тот же интерфейс A ", то у вас есть ** два разных ** интерфейса. См. Мой ответ для получения дополнительной информации. Все типы, включая интерфейсы, определяются их сборкой. –

ответ

5

я сомнения он применяется здесь, но есть один край случай порог CreateInstance возвращается null (а именно Nullable<T>), и один крайний угла случай (ProxyAttribute, обсуждали here), где обычный класс может построить к null ,

Но более вероятно:

  • не существует (имя неправильно, возможно)
  • вы используете as, а интерфейс не реализован (возможно, интерфейс объявлен в двух различные сборки; она подсчитывает отдельно как разных интерфейсов в каждом, даже если имя и пространство имен идентичны)

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

+0

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

2

Пожалуйста, обратитесь к документации:

http://msdn.microsoft.com/en-us/library/aa329906(v=VS.71).aspx

Это возвращает нуль, так как тип вы передаете в не найден. Если вы разместите свой код, возможно, мы можем быть более конкретным!

2

Функция возвращает null, если она не может найти указанный тип или тип не имеет конструктора по умолчанию. См. documentation на MSDN.

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

0

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

0

Вы можете попробовать устранить неполадки в своей проблеме, используя Assembly Binding Log Viewer (fuslogvw), чтобы попытаться выяснить, имеются ли какие-либо сбойные привязки.

2

Просто так получилось, что Ассамблея.CreateInstance возвращает null, если он вызывается классом, который находится в той же сборке, что и запрашиваемый тип. Я думаю, что люди .NET думали, что вам никогда не понадобится делать такое, что было очень неправильным предположением.

Вызов Assembly.CreateInstance должен выполняться из класса, находящегося вне сборки, который содержит тип объекта, который вы пытаетесь создать.

Идти цифра.

+0

У вас есть источник, поддерживающий это? Мне любопытно узнать больше. – Matt

0

Более надежный способ сделать это может заключаться в использовании Activator.CreateInstance и передать его непосредственно.

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