0

我有一个应用程序,它由一个 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

4 回答 4

1

这与 DLL 的位置无关。听起来真正的问题是DLL被加载到“MyExeApplication”应用程序域中,您需要从“TestApplication”应用程序域获得访问权限。事实证明,.NET Remoting 旨在用于跨应用程序域的通信。在MSDN上有很多关于它的信息。

于 2009-05-22T00:55:23.447 回答
0

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

祝你好运!

于 2009-05-21T23:43:03.123 回答
0

据我所知,没有办法做到这一点,除非作为调试器附加到另一个进程。

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

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

于 2009-05-22T00:57:19.620 回答
0

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

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

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

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

我想这从反思中是不可能的。但是在 VB6 中,您可以说类似 object o = GetObject(,"MyExeApplication.Class") 的内容,然后我可以说 o.GetBasicValues())。

于 2009-05-22T12:48:26.693 回答