gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:43:53 25 4
gpt4 key购买 nike

假设您正在开发一个名为 "ThirdParty.dll" 的第三方 DLL,它有一个名为 JustTryToInstantiateMe 的类。假设您的客户有一个引用了 "ThirdParty.dll" 的 EXE,或者 EXE 没有引用 "ThirdParty.dll" 但 EXE如果以某种方式请求,可以在 PATH 中找到 "ThirdParty.dll"。您无法控制 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 文件,则代码几乎没有什么不同,但您需要创建一个桌面/控制台应用程序来对其他可执行文件进行 shell 处理,并为您的 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 中。

关于c# - 隐式创建位于依赖 dll 中的类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30062672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com