如何从.NET Dll或Exe访问.NET独立可执行文件的运行实例?

时间:2009-05-21 23:36:25

标签: c# .net memory executable

我有一个应用程序,它包含一个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;}
   }
}

现在假设应用程序在内存中运行(可执行文件)。 我的目的是创建另一个独立的应用程序,并在类库中的函数Calculate中使用值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的实例并从那里读取值?还有其他办法吗?

谢谢

4 个答案:

答案 0 :(得分:1)

这不是DLL位于何处。听起来真正的问题是DLL被加载到“MyExeApplication”应用程序域中,您需要从“TestApplication”应用程序域获取访问权限。事实证明,.NET Remoting旨在通过appdomains进行通信。在MSDN有很多关于它的信息。

答案 1 :(得分:0)

如果您将TestApplication,MyExeApplication和MyClassLibrary构建到同一文件夹(在项目的“属性”菜单中设置输出文件夹),我想您可以避免使用反射。另外,我很好奇为什么你需要做这样的事情? BasicValues是否可以被SQL表甚至注册表设置替换?

祝你好运!

答案 2 :(得分:0)

谢谢大家的回复。 我目前使用注册表作为临时存储来存储值。 我将阅读有关远程处理和应用程序域的信息,并尝试这样做。

我想要它的原因是,我有一个在后台运行的exe应用程序(最小化到Windows托盘)。这个exe应用程序充当中央API并生成一些Web登录信息,这些信息必须可以从任何使用MyClassLibrary.dll的TestApplication访问。

如果我把我的dll类中的所有代码都放到exe中然后只有一个包含所有内容的可执行文件会不会很好?

然后在MyTestApplication中我可以添加对exe的引用。但我仍然会遇到同样的问题。因为如果我想创建另一个与exe API集成的应用程序,例如MyTestApplication2并添加对exe的引用我还会遇到同样的问题吗?

我想这不可能来自反思。 但是在VB6中你可以说像对象o = GetObject(,“MyExeApplication.Class”)然后我可以说o.GetBasicValues())。

答案 3 :(得分:0)

没有办法做到这一点,我知道,没有作为调试器附加到其他进程。

您最好的选择是让第一个应用程序将Hashtable存储在某个共享空间中。作为磁盘上的文件,数据库中的文件,具有某种形式的共享内存,或者使用远程传递来传递它。

您要使用哪个选项实际上取决于每个应用程序将如何使用数据。