如何从C++程序(.NET 4)运行regasm.exe

How to run regasm.exe from a C++ program (.NET 4)

本文关键字:运行 regasm exe NET C++ 程序      更新时间:2023-10-16

我需要从使用它的C++程序中注册.NET COM dll。对于比.NET 4更早的.NET版本,这在如何从C++程序运行regasm.exe?中有解释?。以下是提供旧版本CLR路径的最小代码(无检查)。

CComBSTR mscoreeName("mscoree.dll");
HINSTANCE hMscoree = CoLoadLibrary(mscoreeName, FALSE);
typedef HRESULT (WINAPI *LPFNGETCORSYSDIR)(LPWSTR, DWORD, DWORD*);
LPFNGETCORSYSDIR lpfunc = (LPFNGETCORSYSDIR)GetProcAddress(hMscoree,_T("GetCORSystemDirectory"));
DWORD bufferSize = 256;
DWORD bufferUsed;
LPWSTR pwzBuffer = new WCHAR[bufferSize];
(*lpfunc)(pwzBuffer, bufferSize, &bufferUsed);

但是,由于我使用.NET 4,方法GetCORSystemDirectory被ICRRuntimeInfo::GetRuntimeDirectory取代,它不是mscoree.dll中的入口点(使用依赖项检查)。根据MSDN上的文档,该方法作为资源包含在MSCorEE.dll中。

问题是如何从C++获得对该方法的访问权限?

除此之外,我想知道是否没有更简单的方法。。。

问题中工作方式的问题在于找到RegAsm的正确位置。感谢Hans Passant关于使用RegistrationService.RegisterAssembly的评论,我将ClassLibrary更改为自注册可执行文件。

static void Main(string[] args)
{
    if (args.Length != 1)
    {
        ShowHelpMessage();
        return;
    }
    if (args[0].CompareTo("/register") == 0)
    {
        Assembly currAssembly = Assembly.GetExecutingAssembly();
        var rs = new RegistrationServices();
        if (rs.RegisterAssembly(currAssembly, AssemblyRegistrationFlags.SetCodeBase))
        {
            Console.WriteLine("Succesfully registered " + currAssembly.GetName());                    
        } else
        {
            Console.WriteLine("Failed to register " + currAssembly.GetName());                                        
        }
        return;
    }
    if (args[0].CompareTo("/remove") == 0)
    {
        Assembly currAssembly = Assembly.GetExecutingAssembly();
        var rs = new RegistrationServices();
        if (rs.UnregisterAssembly(currAssembly))
        {
            Console.WriteLine("Succesfully removed " + currAssembly.GetName());
        }
        else
        {
            Console.WriteLine("Failed to remove " + currAssembly.GetName());
        }
        return;
    }
    ShowHelpMessage();
}