Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Исключение при попытке создать объект из dll


Автор: Shaman2008 13.11.2018, 21:40
Добрый вечер, уважаемые форумчане!
Я только набираюсь опыта, поэтому, прошу сильно меня не пинать.

Есть необходимость написать приложение, поддерживающее "модули". Все было хорошо первые "три шага", так сказать.

Я никогда не писал ПО подобного плана, поэтому, думаю, что у меня с кодом все плохо, но надо с чего-то начинать...

В общем, в VS я создал решение.
В решении присутствует 3 проекта.

1 проект  - сама программа, которая имеет интерфейс и свои рабочие классы.
2 проект - библиотека классов (dll). В ней я начал описывать базовые классы и интерфейсы для будущих модулей. Эту библиотеку я подключаю как ссылку к основной программе в 1 проекте и как ссылку в 3 проекте.
3 проект - dll с модулями внутри (под модулем, в данном случае, понимается каждый отдельный класс со своей реализацией).

В проекте 2 описан базовый класс, который наследуют классы в модулях:
Код

 public class BaseModule
    {
        ...
    }

interface ISimModule
    {
        ...
    }

public abstract class SimModule : BaseModule, ISimModule
    {
        ...
    }


В проекте 3 я его наследую:
Код

using LockheedMartin.Prepar3D.SimConnect; // сторонняя библиотека, которая необходима для реализации данного конкретного модуля
...

public class P3Dv4 : SimModule
    {
        ...
        private SimConnect _simconnect = null; // стоит добавить эту строчку, как я начинаю ловить Exception в программе на этапе получения экземпляра данного класса....

        public P3Dv4()
        {
            ...
        }
        ...
    }


Загрузка dll с модулями в основной программе происходит следующим образом:
Код

tmpAsm = Assembly.LoadFile(fsModule); // пытаемся загрузить файл dll в память
moduleUnitsNames = tmpAsm.GetExportedTypes(); // пытаемся получить массив типов(модулей), которые есть в сборке
foreach (Type t in moduleUnitsNames) // для каждого типа(модуля) в массиве делаем следующее
{
  try
  {
    BaseModule bm = (BaseModule)tmpAsm.CreateInstance(t.FullName); //  пытаемся получить экземпляр объекта базового типа и
    uint testSignature = bm.Signature; // пытаемся получить сигнатуру данного экземпляра
    ..........
    ..........
  }
  catch (Exception e)  // при ошибке во время попытки получить базовый экземпляр модуля или вызвать один из его методов
  {
     // ловим Exception "Адресат вызова создал исключение." если объявить приватную переменную с классом из сторонней dll (private SimConnect _simconnect = null;) 
  }
}

Если стороннюю библиотеку (LockheedMartin.Prepar3D.SimConnect) использовать "внутри программы", а не "внутри отдельного модуля", то проблем нет, объект создается (SimConnect) и успешно выполняет свои функции...

Подскажите, пожалуйста, в чем может быть проблема? Куда копать?
Спасибо заранее!!!

Автор: Shaman2008 14.11.2018, 10:04
Удалось вытащить сообщение исключения:
"Не удалось загрузить файл или сборку \"LockheedMartin.Prepar3D.SimConnect, Version=4.1.0.0, Culture=neutral, PublicKeyToken=null\" либо одну из их зависимостей. Не удается найти указанный файл."

Данная библиотека лежит в корне с программой. Почему он ее не видит? Может необходимо в ручную ее загрузить как-то в основную программу?
Похоже, надо разбираться с таким понятием как AppDomain... Если кто в курсе, подскажите пожалуйста.

Заранее спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)