Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
5 / 5 / 4
Регистрация: 20.01.2011
Сообщений: 350
1
.NET 4.x

Невозможно создать экземпляр интерфейса

24.08.2014, 16:38. Показов 3851. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. В общем делал "как по учебнику", но не работает и не могу понять почему(
Итак, есть три проекта:
1 проект - содержит всего один файл с описанием интерфейса:
C#
1
2
3
4
5
6
7
8
9
10
11
namespace mpPInterface
{
    public interface IPluginInterface
    {
        string Name { get; }
        string Description { get; }
        string Author { get; }
        string Version { get; }
        string AvailCad { get; }
    }
}
2 проект - это плагин, который должен подключаться к основной программе:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Reflection;
using mpPInterface;
 
namespace mpTxtCenter
{
    public class Interface : IPluginInterface
    {
        private const string _Name = "mpTxtCenter";
        private const string _Description = "";
        private string _Version;
        private const string _Author = "Modis";
        private const string _AvailCad = "2010";
        public string Name { get { return _Name; } }
        public string Description { get { return _Description; } }
        public string Version { get { return _Version; } set
        {
            _Version = Assembly.GetExecutingAssembly().GetName().Version.ToString();
        } }
 
        public string Author { get { return _Author; } }
        public string AvailCad { get { return _AvailCad; } }
    }
}
3 проект - программа, которая должна всего лишь ОТОБРАЗИТЬ сведения о плагине:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
foreach (var fileName in Directory.GetFiles(
                            Path.Combine(CurDir,"Functions"),
                            "*.dll",
                            SearchOption.AllDirectories))
                        {
                            var localFuncAssembly = Assembly.LoadFrom(fileName);
                            var a = GetLoadableTypes(localFuncAssembly);
                            foreach (Type bType in a)
                            {
                                var c = bType.GetInterface(typeof(IPluginInterface).Name);
                                if (c != null)
                                {
                                    var plugin = Activator.CreateInstance(c) as IPluginInterface;
                                    if (plugin != null)
                                    {
                                        var ff = plugin.Version;
                                        Console.WriteLine(plugin.Version);
                                    }
                                }
                            }
                        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
public static IEnumerable<Type> GetLoadableTypes(Assembly assembly)
        {
            if (assembly == null) throw new ArgumentNullException("assembly");
            try
            {
                return assembly.GetTypes();
            }
            catch (ReflectionTypeLoadException e)
            {
                return e.Types.Where(t => t != null);
            }
        }
На строчке var plugin = Activator.CreateInstance(c) as IPluginInterface; ловлю ошибку Невозможно создать экземпляр интерфейса
По всему интернету только вот такой пример и приводится и у всех работает!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.08.2014, 16:38
Ответы с готовыми решениями:

Невозможно создать экземпляр абстрактного класса или интерфейса
using System.Windows.Media.Imaging; using System.Drawing; Есть эти две библиотеки, нужно...

Невозможно создать экземпляр абстрактного класса или интерфейса "System.IO.TextWriter"
SaveFileDialog saveFileDialog1 = new SaveFileDialog(); if...

Не могу создать экземпляр интерфейса
Доброго времени суток. Только начал осваивать c#. Пробую подключить библиотеку beward.camera.dll...

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

3
Эксперт .NET
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
24.08.2014, 16:47 2
В метод CreateInstance передавайте bType, а не c.
Переменная c нужна для проверки, реализует ли класс, представленный типом bType, интерфейс IPluginInterface.
Проверили, если реализует (с != null), то создаем экземпляр типа bType
1
5 / 5 / 4
Регистрация: 20.01.2011
Сообщений: 350
24.08.2014, 16:53  [ТС] 3
kolorotur, вот спасибо) Такую глупость сглупил))

И сразу возник вопрос =)
В плагине я писал так
C#
1
2
3
4
public string Version { get { return _Version; } set
        {
            _Version = Assembly.GetExecutingAssembly().GetName().Version.ToString();
        } }
В моей программе эти строчки
C#
1
2
var ff = plugin.Version;
Console.WriteLine(plugin.Version);
вернули мне null
Да, я понимаю, что мне просто нужно убрать оттуда Version и брать это значение непосредственно с Assembly (так и сделаю), но интересно - почему так?
0
Эксперт .NET
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
24.08.2014, 16:59 4
Цитата Сообщение от Modis Посмотреть сообщение
почему так?
Ну потому что геттер у вас возвращает значение закрытой переменной _Version, изначальное значение которой равно null, а меняется только тогда, когда вызывается сеттер свойства Version.
Если он нигде не вызывается, то и значение переменной никогда не меняется.

Кстати, GetExecutingAssembly вернет информацию об исполняющем файле, а следовательно и его версию, а не версию вашей дллки.
0
24.08.2014, 16:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2014, 16:59
Помогаю со студенческими работами здесь

Ошибка: Невозможно создать экземпляр абстрактного класса
class Program { static void Main(string args) { List&lt;Prog&gt;...

Невозможно привести объект типа "System.__ComObject (Интерфейс наследован от интерфейса)
Доброго времени суток! Недавно столкнулся с проблемой при получении интерфейсного объекта из DLL...

Создать класс, такой, чтобы невозможно создать больше 3-х объектов этого класса
Добрий день товарищи!!! Помогите написать вот такую задачка.... Создать класс, такой, чтобы...

Создать экземпляр List<T>
1. Работа с обобщениями. a. Создать экземпляр List&lt;T&gt;, T – в соответствии с вариантом b. Добавить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru