Reflection 反编译的.winmd文件只包含外部调用

Reflection 反编译的.winmd文件只包含外部调用,reflection,windows-8,microsoft-metro,Reflection,Windows 8,Microsoft Metro,我正在尝试将我的Windows应用商店应用程序的ComboBox控件反编译为C#,但没有代码。相反,所有属性似乎都是对单独程序集的调用。如何找到真正的代码存在的地方,以及如何读取C#中的方法体?我无法读取程序集,因此这对我没有好处因此我找到了程序集。您只需在系统上搜索.dll文件(例如,在我的例子中是Windows.XAML.UI.Controls.dll),但无法将其反汇编为C#。事实证明,WinRT组件没有C#反汇编程序(至少在我上次查看时是这样)关于如何对WinRT内部进行反向工程的一些说

我正在尝试将我的Windows应用商店应用程序的ComboBox控件反编译为C#,但没有代码。相反,所有属性似乎都是对单独程序集的调用。如何找到真正的代码存在的地方,以及如何读取C#中的方法体?我无法读取程序集,因此这对我没有好处

因此我找到了程序集。您只需在系统上搜索.dll文件(例如,在我的例子中是Windows.XAML.UI.Controls.dll),但无法将其反汇编为C#。事实证明,WinRT组件没有C#反汇编程序(至少在我上次查看时是这样)

关于如何对WinRT内部进行反向工程的一些说明。
在引擎盖下,WinRT是纯COM。您想在机器上查看的第一个位置是

C:\Program Files (x86)\Windows Kits\8.0\Include\WinRT
此目录包含IDL文件,或。IDL是描述COM类型的起点。快速搜索
组合框
可以找到
Windows.UI.Xaml.Controls.IDL
组合框
类型的声明:

    [marshaling_behavior(agile)]
    [threading(both)]
    [static(Windows.UI.Xaml.Controls.IComboBoxStatics, 0x06020000)]
    [version(0x06020000)]
    [composable(Windows.UI.Xaml.Controls.IComboBoxFactory, public, 0x06020000)]
    runtimeclass ComboBox : Windows.UI.Xaml.Controls.Primitives.Selector
    {
        [default] interface Windows.UI.Xaml.Controls.IComboBox;
        [overridable] interface Windows.UI.Xaml.Controls.IComboBoxOverrides;
    }
它有点可读,类似于C#中的接口声明。如果您以前修改过COM,那么您将看到原始IDL语法中的新属性。额外的东西可以帮助您的运行时支持库中内置的语言投影,从而产生WinRT支持实现继承、泛型和静态类成员的错觉,这些特性是纯COM所不具备的

这些IDL文件由
midlrt.exe
编译成机器可读格式,可供编译器等工具使用。您已经知道该格式,
midlrt.exe
的输出是一个
.winmd
文件。与旧的但增强了很多的类型库类似,底层格式采用了。因此,反编译.winmd文件没有用处,因为您的计算机上已经有了源代码;)

与COM中常见的情况一样,注册表用于查找包含COM服务器代码的可执行文件。启动
regedit.exe
并导航到
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\WindowsRuntime\ActivatableClassId
。您将找到应用程序可以创建的所有WinRT类型的列表。
Windows.UI.Xaml.Controls.ComboBox
键就是您感兴趣的键。请注意
DllPath
值,该值指向包含代码的DLL:
C:\Windows\System32\Windows.UI.Xaml.DLL
。CLSID值是常见的COM类guid,用于请求类工厂创建实例


这就是你碰壁的地方;DLL像大多数COM服务器一样包含本机代码。用C++编写并编译成机器代码。它对反编译非常不敏感,是一个18兆字节的怪物。

@iaimtomisbehave提醒我,我忘了提到它是在寻找C代码,而不是汇编代码。我并没有试图反编译到汇编,也无法说明这是否有效。我对问题进行了编辑以反映这一点。