从非GAC程序集创建未知类的实例

时间:2016-06-24 09:47:11

标签: c# powershell .net-assembly

听起来像我知道的一个愚蠢的问题,但请耐心等待:-)我目前正在创建一个包含一些自定义命令的PoSh模块。我之前已经编写了一个PoSh高级模块来做我想做的事情,但是我已经决定是时候冒险尝试C#了!

我的一个命令需要创建一个包含在第三方SDK程序集中的类的实例。该程序集不包含在GAC中。在我以前的PoSh高级功能中,我会查询一个注册表项以确认SDK已安装(并获取它的路径),然后我将使用System.Reflection.Assembly.LoadFile来加载程序集。

在我的C#版本中,我的计划是做类似的事情。我设法查询注册表,确认程序集存在等甚至加载它。但是,因为在Visual Studio中没有引用程序集,所以当我尝试从该程序集实例化一个类时,它只会抛出大量的intellisense错误。我最初怀疑我可能需要使用Activator类中的一些东西来解决这个问题,但是我已经完成了所有方法并且找不到任何可能有用的方法。

经过一番思考之后,我想知道我的方法是否错了,也许我不应该做"手册"加载,但允许.net处理所有这些,例如通过添加对程序集的引用。但是,在这种情况下,如何在VS中引用程序集而不知道它将在目标/调用机器上安装的位置(或者甚至是否)?

或者,如果我的原始方法是正确的,如何实例化类"手动" (或其他方面)没有VS那么不开心。我确实考虑过添加"临时"参考我机器上的组件,但我认为在进行零售构建之前我必须再次删除它。而且我还必须添加临时使用指令。

我已经搜索了相当多的内容,但是找不到任何可能对我有帮助的东西。所以我非常感谢任何人都可以提供的任何指导。也许我应该完全看一下其他的东西,比如App Domains?

提前致谢

1 个答案:

答案 0 :(得分:0)

加载程序集后,使用CreateInstance方法并将结果存储在dynamic类型变量中:

dynamic test = assembly.CreateInstance("Full.Type.Name");

你不会得到intellisense,但编译器会假设这个变量支持任何操作。请注意,无效操作只会在运行时导致错误。