C# 两个程序如何获得同用内存,一程序调用另外一程序内的方法或函数
2014-10-13 10:46
876 查看
网上搜索了不少文档,找了半天没有找到合适的方法;
最后看到一个有关映射的说明。尝试了一下竟然成功了,简单写点东西出来总结和学习一下!!
C#反射的入门学习首先要明白C#反射提供了封装程序集、模块和类型的对象等等。那么这样可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。
反射通常具有以下用途:
使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。
使用 Module 发现以下信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
使用 ConstructorInfo 发现以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。
使用 MethodInfo 发现以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。
使用 FieldInfo 发现以下信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。
使用 EventInfo 发现以下信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。
使用 PropertyInfo 发现以下信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。
使用 ParameterInfo 发现以下信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。
当您在一个应用程序域的仅反射上下文中工作时,请使用 CustomAttributeData 来了解有关自定义属性的信息。使用 CustomAttributeData,您不必创建属性的实例就可以检查它们。
System.Reflection.Emit 命名空间的类提供了一种特殊形式的反射,使您能够在运行时生成类型。
反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。
反射还有其他一些用途。JScript 等语言编译器使用反射来构造符号表。System.Runtime.Serialization 命名空间中的类使用反射来访问数据并确定要持久保存的字段。System.Runtime.Remoting 命名空间中的类通过序列化来间接地使用反射。
自己根据网上的一些简单的例子写了一个两个exe程序直接的方法调用内存共享,以供参考!
效果图:
最后看到一个有关映射的说明。尝试了一下竟然成功了,简单写点东西出来总结和学习一下!!
C#反射的入门学习首先要明白C#反射提供了封装程序集、模块和类型的对象等等。那么这样可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。
反射通常具有以下用途:
使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。
使用 Module 发现以下信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
使用 ConstructorInfo 发现以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。
使用 MethodInfo 发现以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。
使用 FieldInfo 发现以下信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。
使用 EventInfo 发现以下信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。
使用 PropertyInfo 发现以下信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。
使用 ParameterInfo 发现以下信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。
当您在一个应用程序域的仅反射上下文中工作时,请使用 CustomAttributeData 来了解有关自定义属性的信息。使用 CustomAttributeData,您不必创建属性的实例就可以检查它们。
System.Reflection.Emit 命名空间的类提供了一种特殊形式的反射,使您能够在运行时生成类型。
反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。
反射还有其他一些用途。JScript 等语言编译器使用反射来构造符号表。System.Runtime.Serialization 命名空间中的类使用反射来访问数据并确定要持久保存的字段。System.Runtime.Remoting 命名空间中的类通过序列化来间接地使用反射。
自己根据网上的一些简单的例子写了一个两个exe程序直接的方法调用内存共享,以供参考!
namespace BCSV1 { public partial class XmlTest : Form { public static XmlDocument xmldoc = new XmlDocument(); public XmlTest() { InitializeComponent(); } public XmlDocument GetXml() { xmldoc.Load("G:\\Test.xml");//装载XML文档 return xmldoc; } } }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Xml.Linq; using System.Xml; using System.Reflection; namespace WindowsFormsClient { public partial class XmlTest : Form { Assembly ass; Type type; Object obj; public static XmlDocument xmldoc1 = new XmlDocument(); public XmlTest() { InitializeComponent(); Object any = new Object(); ass = Assembly.LoadFile(@"G:\粟汝发\BCSV1\BCSV1\bin\Debug\BCSV1.exe"); type = ass.GetType("BCSV1.XmlTest"); // type = ass.GetType("ReflectionTest.WriteTest"); /*example1---------*/ Object[] parametors = new Object[] { }; MethodInfo method = type.GetMethod("GetXml"); obj = ass.CreateInstance("BCSV1.XmlTest"); xmldoc1= (XmlDocument)method.Invoke(obj,//Instance object of the class need to be reflect parametors); } public class TreeTableNodeClass { public int id { get; set; } public int pid { get; set; } public int typeId { get; set; } public string name { get; set; } } private void btnTest_Click(object sender, EventArgs e) { } private void btnRead_Click(object sender, EventArgs e) { // BCSV1.XmlTest bx = new BCSV1.XmlTest(); // xmldoc1 = bx.GetXml(); //xmldoc.Load("G:\\Test.xml");//装载XML文档 TreeNode rootnode = new TreeNode("cross工程"); TreeTableNodeClass temp = new TreeTableNodeClass(); temp.id = 0; temp.pid = 0; temp.name = "cross工程"; rootnode.Tag = temp; treeView1.Nodes.Add(rootnode); XmlNode xmlNode = xmldoc1.SelectSingleNode(temp.name); //构建TreeView的层次结构 CreateTvBulidingLevel(temp.name, rootnode, xmlNode); } /// <summary> /// 通过递归 构建TreeView的层次结构树 /// </summary> /// <param name="pid">父节点ID</param> /// <param name="tn">要插入为哪个TreeView节点子节点</param> private void CreateTvBulidingLevel(string NodeName, TreeNode tn,XmlNode xmlNode) { XmlNode xmlnode; XmlElement xmlelem; string s = "//" + NodeName; xmlnode = xmlNode.SelectSingleNode(s); foreach (XmlNode xmlnod in xmlnode) { xmlelem = (XmlElement)xmlnod; TreeTableNodeClass temp = new TreeTableNodeClass(); temp.id = Convert.ToInt32(xmlelem.GetAttribute("id").ToString()); temp.pid = Convert.ToInt32(xmlelem.GetAttribute("pid").ToString()); temp.name = xmlelem.GetAttribute("nodeName").ToString(); ; temp.typeId = Convert.ToInt32(xmlelem.GetAttribute("typeId").ToString()); TreeNode childTreeNode = new TreeNode(temp.name); childTreeNode.Tag = temp; tn.Nodes.Add(childTreeNode); s = NodeName + "//" + temp.name; CreateTvBulidingLevel(s, childTreeNode,xmlnod); } } //private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e) //{ // TreeNode selectNode = new TreeNode(); // if (treeView1.SelectedNode != null) // { // selectNode = treeView1.SelectedNode; // } // MessageBox.Show(treeView1.SelectedNode.Text); //} private void treeView1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { Point p1 = new Point(e.X, e.Y); TreeNode nod1 = this.treeView1.GetNodeAt(p1); if (nod1 != null && e.Button == MouseButtons.Right) { this.treeView1.SelectedNode = nod1; MessageBox.Show(this.treeView1.SelectedNode.Tag.GetType().ToString()); } } private void treeView1_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e) { Point p1 = new Point(e.X, e.Y); TreeNode nod1 = this.treeView1.GetNodeAt(p1); if (nod1 != null) { this.treeView1.SelectedNode = nod1; MessageBox.Show(treeView1.SelectedNode.Text); } } } }
效果图:
相关文章推荐
- java本地方法如何调用其他程序函数,方法详解
- 5.编写一个程序,有两个类,其中类MAX中具有两个方法,方法名都是max,一个方法能够比较两个数的大小,另外一个方法能够比较三个数的大小。在另外一个类中创建对象,调用这两个方法,分别输出两组数:2、6
- C#调用Exe文件的方法及如何判断程序调用的exe已结束
- C# 如何利用反射来加载程序集,并调用程序集中有关类的方法
- 关于C#如何动态加载程序并调用其中某个类的方法
- java本地方法如何调用其他程序函数,方法详解2
- 学习C#高级编程--在重写基类的方法中,如何调用基类的函数
- 用C#调用Windows API和其它进程通信及C# 获得另外一程序 句柄 后控制该程序 控制其透明 窗体大小
- C#调用Exe文件的方法及如何判断程序调用的exe已结束
- C# 如何利用反射来加载程序集,并调用程序集中有关类的方法【转】
- 编写c51程序调用汇编函数的一种方法
- 在ActiveX控件中如何动态调用DLL函数之"准"一体化方法
- 如何用C#程序调用bat文件的同时向bat文件传递类似字符串这样的参数?
- Inside VCL:接口指针调用函数的时候,如何获得对象指针以完成函数调用?
- c 语言中, 如何让两个函数共用一组变量, 而在主程序中是不可见的?
- 求教,c#如何调用delphi编写的dll中的函数
- 使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- 使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- 转:使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- 在WinForm中用C#如何调用外部程序