Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从.NET Dll或Exe访问.NET独立可执行文件的运行实例?_C#_.net_Memory_Executable - Fatal编程技术网

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

C# 如何从.NET Dll或Exe访问.NET独立可执行文件的运行实例?,c#,.net,memory,executable,C#,.net,Memory,Executable,我有一个由windows窗体项目和类库项目组成的应用程序。当它启动时,可执行文件在dll中设置一个静态值 using MyClassLibrary; namespace MyExeApplication { public partial class MainForm : Form { Hashtable ht = null; void Form_Load(...) { ht = new Hashtable();

我有一个由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中的值BasicValue

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实例并从中读取值?还有别的办法吗


谢谢

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


祝你好运

这不是DLL位于何处的问题。听起来真正的问题是DLL被加载到“MyExeApplication”appdomain中,您需要从“TestApplication”appdomain获得访问权限。事实证明,.NETRemoting旨在跨应用程序域进行通信。在上有一大堆关于它的信息。

我知道,除了作为调试器附加到另一个进程之外,没有办法做到这一点

最好的选择是让第一个应用程序将哈希表存储在某个共享空间中。可以作为磁盘上的文件、数据库中的文件以及某种形式的共享内存,也可以通过远程处理来传递


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

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

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

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

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

我想这是不可能的。
然而,在VB6中,你可以说像object o=GetObject(,“MyExeApplication.Class”),然后我可以说o.GetBasicValues()。

我一直想要像你在VB6中所说的进程外COM服务器这样的东西。不幸的是,.NET没有等效的机制。有远程处理,但它远没有那么简单和易于使用。