Как я могу получить доступ к запущенному экземпляру автономного исполняемого файла .NET из .NET Dll или Exe? - PullRequest
0 голосов
/ 22 мая 2009

У меня есть приложение, которое состоит из проекта формы Windows и проекта библиотеки классов. При запуске исполняемый файл устанавливает статическое значение в dll.

using MyClassLibrary;
namespace MyExeApplication
{
   public partial class MainForm : Form
   {
        Hashtable ht = null;
        void Form_Load(...)
        {
          ht = new Hashtable();
          ht.add("1", "Open");
          ht.add("2", "Close");
          Calculate.BasicValues = ht;
        }
        public Hashtable GetBasicValues()
        {
          return ht;
        }
   }

}     
namespace MyClassLibrary
{
   public class Calculate()
   {
       public static Hashtable BasicValues {get; set;}
   }
}

Теперь предположим, что приложение работает в памяти (исполняемый файл). Моя цель - создать другое автономное приложение и использовать значение BasicValues ​​в функции Calculate в библиотеке классов.

using MyClassLibrary;
namespace TestApplication
{
  public partial class MainForm : Form
  {
     private void TestValueFromDll()
     {
          System.Windows.Forms.MessageBox.Show("Values of Hashtable");
          Hashtable ht = Calculate.BasicValues;
          //The hashtable is null and values are not there
          //The above will not work. Could I say something like
          //Get the running instance of MyExeApplication 
          //and invoke GetBasicValues() ?                
     }
  }
}

Я полагаю, это не работает, потому что моя TestApplication скопировала MyClassLibrary.dll в папку bin, где находится исполняемый файл TestApplication.exe. Таким образом, была использована другая DLL (не DLL, которая использовалась первым приложением MyExeApplication).

И мой вопрос, как я могу решить эту проблему? Можно ли использовать отражение и получить экземпляр MyExeApplication и прочитать значения оттуда? Есть ли другой способ?

Спасибо

Ответы [ 4 ]

1 голос
/ 22 мая 2009

Дело не в том, где находится DLL. Похоже, что реальная проблема заключается в том, что DLL загружается в домен приложения «MyExeApplication», и вам необходимо получить доступ из домена приложения «TestApplication». И, как оказалось, .NET Remoting был предназначен для связи между доменами приложений. Об этом есть информация на MSDN .

0 голосов
/ 22 мая 2009

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

Причина, по которой я этого хочу, в том, что у меня есть приложение exe, работающее в фоновом режиме (свернутое в трей Windows). Это приложение exe действует как центральный API и генерирует некоторую информацию для входа в сеть, которая должна быть доступна для доступа из любого TestApplication, использующего MyClassLibrary.dll.

Было бы хорошо, если бы я поместил весь код из моего класса dll в exe, а затем имел только один исполняемый файл, в котором есть все?

Тогда в MyTestApplication я мог бы добавить ссылку на exe. Но у меня все равно будет такая же проблема. Потому что, если я хочу создать другое приложение, которое интегрируется с exe API, например, MyTestApplication2 и добавить ссылку на exe у меня все еще будет та же проблема?

Полагаю, это невозможно из-за размышлений. Однако в VB6 вы могли бы сказать что-то вроде object o = GetObject (, "MyExeApplication.Class"), а затем я мог бы сказать o.GetBasicValues ​​()).

0 голосов
/ 22 мая 2009

Нет способа сделать это, о чем я знаю, кроме как присоединиться к другому процессу в качестве отладчика.

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

Какой вариант вы хотите использовать, будет зависеть от того, как данные будут использоваться каждым приложением.

0 голосов
/ 22 мая 2009

Если вы соберете TestApplication, MyExeApplication и MyClassLibrary в одну и ту же папку (установив выходную папку в меню «Свойства» проектов), я могу предположить, что вы можете избежать использования отражения. Кроме того, мне интересно, почему вам нужно сделать что-то подобное? Является ли BasicValues ​​чем-то, что можно заменить таблицей SQL или даже параметрами реестра?

Удачи!

...