【发布时间】:2015-10-23 17:58:34
【问题描述】:
我要么在谷歌上搜索错误的东西,要么试图走完全错误的道路(很可能)......但现在我很好奇,所以我想问一下。
长话短说,我正在尝试利用 Microsoft 消息分析器工具的底层“API”框架来构建自定义应用程序。我说“API”是因为没有对 API 的正式支持,没有文档,而且在不久的将来也不会有任何支持(如果有的话)(无论如何,微软的 Paul 都是这么说的)。因此,我一直在使用 IL DASM 工具来探索一些消息分析器和 PowerShell .dll,以尝试了解这些东西是如何工作的;最终目标当然是使用 MA 的 .dll 和驱动程序来为自定义应用程序做我想做的事情。我正在查看 Microsoft.Protocols.Tools.PowerShell.dll,它有一个我正在尝试实例化的类 (Microsoft.Protocols.Tools.PowerShell.PpkTraceSession):
但是,如果您看它的正下方,它会说明该类是私有的(它在图片中被截断,但该类确实实现了 IPpkTraceSession 和 IPpkTraceSessionEx)。果然,当我在一些 C# 代码中引用这个 .dll 并尝试实例化一个对象时,我得到一个编译错误,说由于它的保护级别而无法访问:
Windows PowerShell 创建这些对象之一完全没有问题。恰好下面看到的打印输出与 PpkTraceSession 类的所有属性(第一张图片中未显示)匹配,所以我知道 Windows PowerShell 正在使用一些魔法来创建该类的对象,我只是想不通显然这个类是私有的。
所以我的问题是,这里发生了什么?我已经浏览了 IL DASM 输出中显示的许多类,其中有很多看起来是私有的。也许这只是我的坏习惯,但我很少使用或看过很多私人课程。我的理解是它们必须嵌套在其他类中才能有任何特定用途。如果 PpkTraceSession 嵌套在另一个类中,则从 IL DASM 输出中根本不清楚。您可能会看到上面的 IPpkTraceSession(Ex) 接口,如果有一种方法可以使用我还没有弄清楚的那些来访问类属性。无论如何要实例化这个类的对象,还是我做错了?
这可能接近重复,但我不这么认为。任何帮助深表感谢!我显然对 Windows 编程知之甚少。
矢野
编辑:::::: 只是为了解决所有松散的问题(以防其他人犯了我的错误),几天前我发现了我的困惑的根源。 IL DASM 工具指示为“私有”的所有类实际上都是“内部”类,这意味着它们只能在自己的程序集中可见。那是我缺少的部分,当 C# 甚至不允许您编译独立的私有类(它必须嵌套在另一个类中)时,我无法理解所有这些私有类的来源。在发布问题之前,我应该对 IL DASM 进行更多研究,但我什至没有想到;我认为私人意味着私人。据我观察,IL DASM 确实区分了私有/内部类和嵌套的私有类。此问题也已在此处解决:When I declare a class as internal, why does the IL show it as private?。感谢大家的帮助!
【问题讨论】:
-
好像你试的类名不对,是PpkTraceSession吗?
-
@Orion_Eagle - 不确定我是否关注。我确实在尝试实例化 PpkTraceSession 类的对象。也许我的帖子中有错字,我没有看到?
-
私有函数可能使用私有全局变量,或其他不安全的部分不暴露在外部。或者用来初始化一些其他的函数变量,一般不用调。它们可能是其他推荐使用公共函数的子函数。
标签: c# powershell dll