![](/img/trans.png)
[英]Can I reference a .NET executable as if it is a DLL in LINQPad 6?
[英]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.