C# 如何从.NET Dll或Exe访问.NET独立可执行文件的运行实例?
我有一个由windows窗体项目和类库项目组成的应用程序。当它启动时,可执行文件在dll中设置一个静态值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();
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没有等效的机制。有远程处理,但它远没有那么简单和易于使用。