簡體   English   中英

如何從.NET Dll或Exe訪問.NET獨立可執行文件的運行實例?

[英]How can I access a running instance of a .NET standalone executable from a .NET Dll or Exe?

我有一個包含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。

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復制到可執行文件TestApplication.exe所在的bin文件夾中。 因此,使用了一個不同的dll(而不是第一個應用程序MyExeApplication使用的dll)。

我的問題是如何解決這個問題? 是否可以使用反射並獲取MyExeApplication的實例並從中讀取值? 還有其他辦法嗎?

謝謝

這與DLL的位置無關。 聽起來真正的問題是DLL已加載到“ MyExeApplication”應用程序域中,並且您需要從“ TestApplication”應用程序域獲得訪問權限。 事實證明,.NET Remoting旨在跨應用程序域進行通信。 MSDN上有很多關於它的信息。

如果將TestApplication,MyExeApplication和MyClassLibrary構建到同一文件夾(在項目的“屬性”菜單中設置輸出文件夾),我想您可以避免使用反射。 另外,我很好奇您為什么需要做這樣的事情? BasicValues是否可以用SQL Table甚至注冊表設置代替?

祝好運!

我知道,除了作為調試器附加到另一個進程之外,沒有其他方法可以做到這一點。

最好的選擇是讓第一個應用程序將Hashtable存儲在某些共享空間中。 可以作為磁盤上的文件,數據庫中具有某種形式的共享內存的文件,也可以通過使用遠程處理將其傳遞出去。

您要使用哪個選項實際上取決於每個應用程序將如何使用數據。

謝謝大家的答復。 我目前正在使用注冊表作為臨時存儲來存儲值。 我將閱讀有關遠程處理和應用程序域的文章,並會嘗試這樣做。

我想要它的原因是,我有一個exe應用程序在后台運行(最小化到Windows托盤)。 該exe應用程序充當中央API,並生成一些Web登錄信息,這些信息必須可從使用MyClassLibrary.dll的任何TestApplication中進行訪問。

如果我將dll類中的所有代碼都放到exe文件中,然后只有一個可執行文件包含所有內容,那就好了嗎?

然后在MyTestApplication中,我可以添加對exe的引用。 但是我仍然會有同樣的問題。 因為如果我想創建另一個與exe API集成的應用程序,例如MyTestApplication2並添加對exe的引用,我是否還會遇到相同的問題?

我猜想這不可能。 但是在VB6中,您可以說類似對象o = GetObject(,“ MyExeApplication.Class”),然后我可以說o.GetBasicValues())。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM