【发布时间】:2015-05-05 20:28:36
【问题描述】:
假设您正在开发一个名为"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() 事件上?也许使用注册表?启动过程?寻找想法...
【问题讨论】:
-
你考虑过Activator.CreateInstance吗?
-
如果 Justtrytoinstantiate me 是一个静态类,当您尝试使用该类时,将自动调用私有静态构造函数。您所需要的只是代码文件中的 using 语句(C#)。
using ThirdParty; -
这两个建议都假定 EXE 知道“JustTryToInstantiateMe”。正如问题中所述,情况并非如此。如果 clr 以某种方式指示 EXE 查找“ThirdParty.dll”,但 EXE 中没有直接引用“JustTryToInstantiateMe”的代码,则 EXE 可以在 PATH 中找到“ThirdParty.dll”
-
@RadioSpace - 你确定最后一部分是真的吗?在不确定的情况下,我想编译器会足够聪明,知道该类型实际上并没有被使用,因此不会调用静态构造函数。只是好奇。
-
你怎么知道你想实例化什么类?你至少有“JustTryToInstantiateMe”作为字符串吗?您可以枚举程序集中的所有类型并使用反射创建实例:msdn.microsoft.com/en-us/library/…