kehu
使用了应用程序域来加载 COM,本想都采用应用程序域的,但没找到传对象到新域里的方法(如传 DataTable、TcpClient 等主域中的对象),所以 Net 的插件采用了读入内存的方法载入,这样就可以给 Net 的插件传主域中的对象了。
调用 COM 插件的方法。
调用 Net 插件的方法。
统一的访问属性、方法。
使用了应用程序域来加载 COM,本想都采用应用程序域的,但没找到传对象到新域里的方法(如传 DataTable、TcpClient 等主域中的对象),所以 Net 的插件采用了读入内存的方法载入,这样就可以给 Net 的插件传主域中的对象了。
1
using System;
2
using System.Reflection;
3
using System.IO;
4
5
6
namespace 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
using System;2
using System.Reflection;3
using System.IO;4

5

6
namespace Loader7
{8
class LoaderDomain9
{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 : MarshalByRefObject40
{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
else70
{71
return null;72
}73
}74

75
public bool IsMember(string name, MemberTypes type)76
{77
if (tmpClass != null && tmpType != null)78
{79
try80
{81
if (tmpType.GetMember(name, type, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase).Length >= 1)82
{83
return true;84
}85
else86
{87
return false;88
}89
}90
catch91
{92
return false;93
}94
}95
else96
{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
try5
{6
7
tmpLoaderDomain.remoteLoader.LoadCOM("类名");8

9

10
}11
catch (Exception err)12
{//创建COM插件。13
MessageBox.Show(err.Message);14

15
}16
finally17
{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
try12
{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

统一的访问属性、方法。
1
tmpRemoteLoader.InvokeMember("属性名", BindingFlags.SetProperty , new Object[] { "参数1", "参数2" });
2
bool tmpReturn = (bool)tmpRemoteLoader.InvokeMember("方法名", BindingFlags.InvokeMethod, null);
tmpRemoteLoader.InvokeMember("属性名", BindingFlags.SetProperty , new Object[] { "参数1", "参数2" });2
bool tmpReturn = (bool)tmpRemoteLoader.InvokeMember("方法名", BindingFlags.InvokeMethod, null);



浙公网安备 33010602011771号