kehu
使用了应用程序域来加载 COM,本想都采用应用程序域的,但没找到传对象到新域里的方法(如传 DataTable、TcpClient 等主域中的对象),所以 Net 的插件采用了读入内存的方法载入,这样就可以给 Net 的插件传主域中的对象了。
调用 COM 插件的方法。
调用 Net 插件的方法。
统一的访问属性、方法。
使用了应用程序域来加载 COM,本想都采用应用程序域的,但没找到传对象到新域里的方法(如传 DataTable、TcpClient 等主域中的对象),所以 Net 的插件采用了读入内存的方法载入,这样就可以给 Net 的插件传主域中的对象了。
1using System;
2using System.Reflection;
3using System.IO;
4
5
6namespace Loader
7{
8 class LoaderDomain
9 {
10 AppDomain appDomain;
11 public RemoteLoader remoteLoader;
12
13 public LoaderDomain(string path)
14 {
15
16 AppDomainSetup tmpSetup = new AppDomainSetup();
17 tmpSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
18 tmpSetup.ShadowCopyDirectories = path;
19
20 appDomain = AppDomain.CreateDomain("newDomain", new System.Security.Policy.Evidence(AppDomain.CurrentDomain.Evidence), tmpSetup);
21
22 RemoteLoader tmpRemoteLoader = new RemoteLoader();
23
24 remoteLoader = (RemoteLoader)
25 appDomain.CreateInstanceAndUnwrap(tmpRemoteLoader.GetType().Assembly.FullName, tmpRemoteLoader.GetType().FullName);
26
27 tmpRemoteLoader = null;
28
29 }
30
31 public void Unload()
32 {
33 AppDomain.Unload(appDomain);
34 appDomain = null;
35 }
36
37 }
38
39 public class RemoteLoader : MarshalByRefObject
40 {
41
42 Object tmpClass = null;
43 Type tmpType = null;
44
45 public void LoadAssembly(string path, string typeName)
46 {
47 /*tmpClass = Assembly.LoadFile(path).CreateInstance(typeName);
48 tmpType = tmpClass.GetType();*/
49
50 tmpClass = Assembly.Load(File.ReadAllBytes(path)).CreateInstance(typeName);
51 tmpType = tmpClass.GetType();
52
53
54 }
55
56 public void LoadCOM(string progID)
57 {
58 tmpType = Type.GetTypeFromProgID(progID);
59 tmpClass = Activator.CreateInstance(tmpType);
60
61 }
62
63 public object InvokeMember(string name, BindingFlags invokeAttr, object[] args)
64 {
65 if (tmpClass != null && tmpType != null)
66 {
67 return tmpType.InvokeMember(name, invokeAttr | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, tmpClass, args);
68 }
69 else
70 {
71 return null;
72 }
73 }
74
75 public bool IsMember(string name, MemberTypes type)
76 {
77 if (tmpClass != null && tmpType != null)
78 {
79 try
80 {
81 if (tmpType.GetMember(name, type, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase).Length >= 1)
82 {
83 return true;
84 }
85 else
86 {
87 return false;
88 }
89 }
90 catch
91 {
92 return false;
93 }
94 }
95 else
96 {
97 return false;
98 }
99 }
100
101 }
102}
103
104
105
2using System.Reflection;
3using System.IO;
4
5
6namespace Loader
7{
8 class LoaderDomain
9 {
10 AppDomain appDomain;
11 public RemoteLoader remoteLoader;
12
13 public LoaderDomain(string path)
14 {
15
16 AppDomainSetup tmpSetup = new AppDomainSetup();
17 tmpSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
18 tmpSetup.ShadowCopyDirectories = path;
19
20 appDomain = AppDomain.CreateDomain("newDomain", new System.Security.Policy.Evidence(AppDomain.CurrentDomain.Evidence), tmpSetup);
21
22 RemoteLoader tmpRemoteLoader = new RemoteLoader();
23
24 remoteLoader = (RemoteLoader)
25 appDomain.CreateInstanceAndUnwrap(tmpRemoteLoader.GetType().Assembly.FullName, tmpRemoteLoader.GetType().FullName);
26
27 tmpRemoteLoader = null;
28
29 }
30
31 public void Unload()
32 {
33 AppDomain.Unload(appDomain);
34 appDomain = null;
35 }
36
37 }
38
39 public class RemoteLoader : MarshalByRefObject
40 {
41
42 Object tmpClass = null;
43 Type tmpType = null;
44
45 public void LoadAssembly(string path, string typeName)
46 {
47 /*tmpClass = Assembly.LoadFile(path).CreateInstance(typeName);
48 tmpType = tmpClass.GetType();*/
49
50 tmpClass = Assembly.Load(File.ReadAllBytes(path)).CreateInstance(typeName);
51 tmpType = tmpClass.GetType();
52
53
54 }
55
56 public void LoadCOM(string progID)
57 {
58 tmpType = Type.GetTypeFromProgID(progID);
59 tmpClass = Activator.CreateInstance(tmpType);
60
61 }
62
63 public object InvokeMember(string name, BindingFlags invokeAttr, object[] args)
64 {
65 if (tmpClass != null && tmpType != null)
66 {
67 return tmpType.InvokeMember(name, invokeAttr | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance, null, tmpClass, args);
68 }
69 else
70 {
71 return null;
72 }
73 }
74
75 public bool IsMember(string name, MemberTypes type)
76 {
77 if (tmpClass != null && tmpType != null)
78 {
79 try
80 {
81 if (tmpType.GetMember(name, type, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase).Length >= 1)
82 {
83 return true;
84 }
85 else
86 {
87 return false;
88 }
89 }
90 catch
91 {
92 return false;
93 }
94 }
95 else
96 {
97 return false;
98 }
99 }
100
101 }
102}
103
104
105
调用 COM 插件的方法。
1
2 //调用COM插件
3 LoaderDomain tmpLoaderDomain = new LoaderDomain(AppDomain.CurrentDomain.BaseDirectory);
4 try
5 {
6
7 tmpLoaderDomain.remoteLoader.LoadCOM("类名");
8
9
10 }
11 catch (Exception err)
12 {//创建COM插件。
13 MessageBox.Show(err.Message);
14
15 }
16 finally
17 {
18 try { tmpLoaderDomain.Unload(); }
19 catch { }
20
21 }
22
23 tmpLoaderDomain = null;
2 //调用COM插件
3 LoaderDomain tmpLoaderDomain = new LoaderDomain(AppDomain.CurrentDomain.BaseDirectory);
4 try
5 {
6
7 tmpLoaderDomain.remoteLoader.LoadCOM("类名");
8
9
10 }
11 catch (Exception err)
12 {//创建COM插件。
13 MessageBox.Show(err.Message);
14
15 }
16 finally
17 {
18 try { tmpLoaderDomain.Unload(); }
19 catch { }
20
21 }
22
23 tmpLoaderDomain = null;
调用 Net 插件的方法。
1
2
3 //调用.Net插件
4
5 string tmpClassPath = "插件路径";
6
7 if (File.Exists(tmpClassPath))
8 {
9
10 RemoteLoader tmpRemoteLoader = new RemoteLoader();
11 try
12 {
13 tmpRemoteLoader.LoadAssembly(tmpClassPath, "类名");
14
15 }
16 catch(Exception err)
17 {//创建.Net插件失败
18 MessageBox.Show(err.Message);
19 }
20
21 tmpRemoteLoader = null;
22
23 }
24
2
3 //调用.Net插件
4
5 string tmpClassPath = "插件路径";
6
7 if (File.Exists(tmpClassPath))
8 {
9
10 RemoteLoader tmpRemoteLoader = new RemoteLoader();
11 try
12 {
13 tmpRemoteLoader.LoadAssembly(tmpClassPath, "类名");
14
15 }
16 catch(Exception err)
17 {//创建.Net插件失败
18 MessageBox.Show(err.Message);
19 }
20
21 tmpRemoteLoader = null;
22
23 }
24
统一的访问属性、方法。
1tmpRemoteLoader.InvokeMember("属性名", BindingFlags.SetProperty , new Object[] { "参数1", "参数2" });
2bool tmpReturn = (bool)tmpRemoteLoader.InvokeMember("方法名", BindingFlags.InvokeMethod, null);
2bool tmpReturn = (bool)tmpRemoteLoader.InvokeMember("方法名", BindingFlags.InvokeMethod, null);