您的位置:首页 > 编程语言 > C#

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程序直接的方法调用内存共享,以供参考!

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);
}
}
}
}


效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐