加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 隐式创建位于依赖dll中的类的实例

发布时间:2020-12-15 22:13:56 所属栏目:百科 来源:网络整理
导读:假设您正在开发一个名为“ThirdParty.dll”的第三方DLL,它有一个名为JustTryToInstantiateMe的类.假设客户拥有的具有参考“ThirdParty.dll”或者也许EXE没有提及“ThirdParty.dll”,但EXE可以在路径中找到“ThirdParty.dll”如果莫名其妙地请求了一个EXE.您
假设您正在开发一个名为“ThirdParty.dll”的第三方DLL,它有一个名为JustTryToInstantiateMe的类.假设客户拥有的具有参考“ThirdParty.dll”或者也许EXE没有提及“ThirdParty.dll”,但EXE可以在路径中找到“ThirdParty.dll”如果莫名其妙地请求了一个EXE.您无法控制EXE,因为您是“Thirdparty.dll”的供应商,并且您只能修改DLL的功能.您的客户,即编写EXE的客户,同意引用您的DLL或将您的DLL放入PATH.而已.

有没有办法在运行EXE时实例化JustTryToInstantiateMe而不显式使用new或调用静态/共享方法/字段/属性?

也许只是以某种方式使用静态/共享构造函数?也许在AssemblyLoad()事件上?也许使用注册表?一个启动过程?寻找创意……

解决方法

我知道如何执行此操作的最近方法是动态加载程序集,然后从您创建的类的实例调用方法.

这是代码中c#的模板:

//add using for system.reflection
        String className = "[NAME OF CLASS WITH FULL NAMESPACE GOES HERE]";
        String methodName = "[METHOD NAME GOES HERE]"
        String dllPath = "[FILE PATH FOR DLL GOES HERE]";

        Assembly assembly = Assembly.LoadFile(dllPath);
        Type type = assembly.GetType(className);
        MethodInfo method = type.GetMethod(methodName);
        object context = Activator.CreateInstance(type);

        //optionally set up parameters here
        object[] parameters = new object[0];
        String result = (String) method.Invoke(context,parameters);

例如,我可以像这样创建一个类(我知道,它是VB,但接下来是C#.

Public Class my_class
            Private hello = "hello world"
            Public Function gethello()
                Return hello
            End Function
        End Class

然后在编译之后,我可以在C#中使用以下代码来做我认为你问的问题:

//using system.reflection
        String className = "mytestlibrary.my_class";
        String dllPath = "...mytestlibrary.dll";
        String methodName = "gethello";
        Assembly assembly = Assembly.LoadFile(dllPath);
        Type type = assembly.GetType(className);
        MethodInfo method = type.GetMethod(methodName);
        object context = Activator.CreateInstance(type);
        object[] parameters = new object[0];
        String result = (String) method.Invoke(context,parameters);
        //result is "hello world"

现在,如果你想做同样的事情,但是已经编译好的EXE文件,那么代码几乎没有什么不同,但你需要创建一个桌面/控制台应用程序来封装其他可执行文件并正确命名你的DLL.因此,在您的应用程序中,添加以下代码以从EXE中引用的DLL中获取类的实例.

Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        String className = "My_Class";
        String ExePath = "[PATH TO EXE]";
        String methodName = "gethello";
        Assembly assembly = Assembly.LoadFile(ExePath);
        Type type = assembly.GetType(className);
        MethodInfo method = type.GetMethod(methodName);
        object context = Activator.CreateInstance(type);
        object[] parameters = new object[0];
        String result = (String) method.Invoke(context,parameters);

你也可以动态地将程序集加载到EXE中,但这有点棘手,所以我现在暂时不做这件事,除非你真的需要动态地将你的DLL加载到EXE中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读