如何从.DLL实例化私有类的对象?

时间:2015-07-31 23:24:12

标签: c# powershell dll

我要么在谷歌搜索错误的东西,要么试图走向完全错误的道路(最有可能)......但现在我很好奇,所以我想我会问。

长话短说,我正在尝试利用Microsoft的Message Analyzer工具的基础“API”框架来实现自定义应用程序。我说“API”是因为没有正式的API支持,没有文档,并且在不久的将来也不会有任何支持(无论如何,保罗在微软都这么说)。因此,我一直在使用IL DASM工具来浏览一些Message Analyzer和PowerShell .dll,试图了解这些东西是如何工作的;当然,最终的目标是使用MA的.dll和驱动程序来完成我想要的自定义应用程序。我正在查看Microsoft.Protocols.Tools.PowerShell.dll,它有一个我试图实例化的类(Microsoft.Protocols.Tools.PowerShell.PpkTraceSession):

I'm interested in the highlighted class

但是,如果你正好在它的下面,它会说这个类是私有的(它在图片中被截断,但是类确实实现了IPpkTraceSession和IPpkTraceSessionEx)。果然,当我在一些C#代码中引用这个.dll并尝试实例化一个对象时,我得到一个编译错误,说它由于其保护级别而无法访问:

error CS0122

Windows PowerShell完全没有问题创建其中一个对象。下面看到的打印输出恰好与PpkTraceSession类的所有属性(第一张图片中未显示)相匹配,所以我知道Windows PowerShell正在创建一个魔法来创建该类的对象,我只是无法弄清楚怎么看起来这个班级是私人的。

Windows PS can create a PpkTraceSession object

所以我的问题,这里发生了什么?我已经在IL DASM输出中显示的很多类中进行了调查,并且其中有很多类似乎是私有的。也许这只是我的不良做法,但我很少使用或看过很多私人课程。我的理解是他们必须嵌套在其他类中才有任何特殊用途。如果PpkTraceSession嵌套在另一个类中,那么IL DASM输出根本就不清楚。您可能会看到上面的IPpkTraceSession(Ex)接口,如果有一种方法可以使用我尚未想到的那些来访问类属性。无论如何都要实例化这个类的对象,还是我认为这一切都错了?

这可能接近重复,但我不认为。任何帮助深表感谢!我显然对Windows编程知之甚少。

矢野

EDIT ::::: 为了解决所有松散的问题(如果其他人犯了我的错误),我几天前就发现了混乱的根源。 IL DASM工具表示为“私有”的所有类实际上都是“内部”类,这意味着它们只能在自己的程序集中可见。这是我遗失的部分,当C#甚至不允许你编译一个独立的私有类(它必须嵌套在另一个类中)时,我无法理解所有这些私有类的来源。在发布问题之前,我应该对IL DASM进行更多的研究,但我甚至都没有想过。我认为私人意味着私人。我的观察是IL DASM确实区分了私有/内部类和嵌套的私有类。此问题也已在此处解决:When I declare a class as internal, why does the IL show it as private?。感谢大家的帮助!

1 个答案:

答案 0 :(得分:0)

我怀疑你所看到的是其他类,可能深入PowerShell管道,可能会暴露PpkTraceSession类的一些属性。您可以通过检查由包含私有PpkTraceSession类的相同dll公开的公共类的中间语言来找到它们。但是,我怀疑你是在浪费时间,并且找不到在自己的代码中使用这些类的方法。

它们被标记为私有,因为Microsoft无意支持它们,并且它们的行为可能会在不事先通知的情况下发生变化。这不是PowerShell团队中的问题,它可以访问它们,最有可能通过其他私有类。因此,如果他们需要改变其中一个类的行为方式,他们就可以做到这一点,并且受影响的受众群体很小且易于访问。

作为开发人员,我可以想到微软可能不想支持它的一系列原因,例如它非常繁琐,或者这样做会涉及披露他们拥有合法权利的专利或专利技术保守秘密。

也许你可以开展宣传活动,但你需要做一个非常好的案例,并说服很多其他人,最好是那些已经付给微软很多钱的人,来支持你。