Jiong

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
kehu

使用了应用程序域来加载 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

调用 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;


调用 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


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



posted on 2007-04-05 22:59  Jiong  阅读(986)  评论(0编辑  收藏  举报