2

我有一个针对 .NET 运行时 (CLR) 的编译器。当前版本的编译器是用标准 C++(非托管)编写的。编译器目前不支持在编译时引用程序集,因此我“导入”.NET 库的方式是使用用 .NET 编写的实用程序存根生成器,它反映任何程序集并以我的自定义语言为它发出签名存根. 我为我使用的所有 .NET 程序集预先生成了存根。在编译时,我的编译器编译存根文件以填充符号表等,以便它可以解析来自 .NET API 的类型和方法。那是我的“使用”版本。然而,这是暂时的,现在我想向编译器添加一个实际的“使用”或“导入”指令。我需要在编译时访问引用程序集中的元数据/类型信息。

我的问题:我需要有关如何从非托管 C++ 访问 CLR 程序集元数据的建议。或者,我需要证明将其转换为托管 C++ 应用程序并使用 .NET 反射支持。纯 C++ 的目的是我也可以在 Linux 上为 Mono 编译,此外,我还为除 CLR 之外的另一个运行时提供部分后端。

4

2 回答 2

3

I think it is done by CoCreateObject() the CLSID_CorMetaDataDispenser coclass, asking for IID_IMetaDataDispenser interface. IMetaDataDispenser::OpenScope() lets you open the assembly metadata. Ask for IID_IMetaDataAssemblyImport, it has a bunch of methods to iterate the metadata.

Watch out for .NET 4.0, it's around the corner and I'm pretty sure the metadata format has changed. Although that should only be an issue for generating metadata, reading should be backwards compatible as long as you get the 4.0 version of the interfaces. <cor.h> has CLSIDs for the version specific metadata coclasses.

I'll assume that you're not interested in Irony.

于 2010-02-13T12:52:13.243 回答
1

这来自于 2006 年 8 月的MSDN文章“CLR Inside Out:CLR Hosting APIs”。

int main(int argc, _TCHAR* argv[])
{
    // 绑定到运行时。
    ICLRRuntimeHost *pClrHost = NULL;
    HRESULT hrCorBind = CorBindToRuntimeEx(
        NULL, // 加载可用的最新 CLR 版本
        L"wks", // 工作站 GC("wks" 或 "svr" 覆盖)
        0, // 不需要标志
        CLSID_CLRRuntimeHost,
        IID_ICLRRuntimeHost,
        (PVOID*)&pClrHost);
 
    // 构造我们的宿主控件对象。
    DHHostControl *pHostControl = new DHHostControl(pClrHost);
    
    // 通知 CLR 此主机实现托管管理器。
    pClrHost->SetHostControl(pHostControl);

    // 现在,启动 CLR。
    HRESULT hrStart = pClrHost->Start();

    // 加载一个程序集并在其中执行一个方法。
    HRESULT hrExecute = pClrHost->ExecuteInDefaultAppDomain(
        pwzAssemblyPath,pwzAssemblyName,
        pwzMethodName, pwzMethodArgs,
        &retVal);
}

还有另一个MSDN 'Advanced Techniques To Avoid and Detect Deadlocks In .NET Apps',2006 年 4 月,其中有一个关于 'Spelunking Through the Hosting APIs' 的部分,在解释如何使用 APIs 进行托管时也会有所帮助一个 C/C++ 代码。

于 2010-02-13T03:26:16.693 回答