Windows 10 中的 CoCreateInstance 错误 0x80131700:无法使用 .NET 运行时 4.0

Posted

技术标签:

【中文标题】Windows 10 中的 CoCreateInstance 错误 0x80131700:无法使用 .NET 运行时 4.0【英文标题】:CoCreateInstance error 0x80131700 in Windows 10: unable to work with .NET runtime 4.0 【发布时间】:2021-10-31 19:15:59 【问题描述】:

我有一个在 Windows 10 企业版 20H2 Build 19042.1052 中运行的旧版 32 位应用程序,操作系统中预装了 .NET Framework 4.8 高级系列并处于活动状态。

旧版应用程序通过以下 C++ 代码作为 COM 对象加载用 C# 编写并使用目标框架 .NET 2.0 为 x86 构建的 .NET 程序集:

    #import "myassembly.tlb" no_namespace, raw_interfaces_only

    IMyClass *pMyClass = nullptr;

...

    HRESULT hr;
    CLSID clsid;

    // Load myassembly.dll as a COM object
    CoInitializeEx(nullptr, COINIT_MULTITHREADED);
    CLSIDFromString(OLESTR("c0dc113c-3839-4427-8da5-35d768aff3d6"), &clsid);          // This is the uuid of MyClass in myassembly.tlh
    hr = CoCreateInstance(clsid, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IMyClass), reinterpret_cast<LPVOID *>(&pMyClass));
    if (FAILED(hr) || pMyClass == nullptr)
    
        cout << "Cannot create COM Object\n";
        cout << "CoCreateInstance" << " hr = 0x" << std::hex << hr << " - ";
        std::wcout << getErrMsg(hr);
        CoUninitialize();
        return 1;
    

我不想在 Windows 10 上安装 .NET Framework 3.5,因此我为 .NET 程序集及其所有 .NET 依赖项添加了一个 .config 文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0"/>
  <supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>

我尝试使用或不使用 useLegacyV2RuntimeActivationPolicy="true" 选项,但总是收到错误 0x80131700(“未知错误”),并弹出一个窗口要求开始安装 .NET Framework 3.5,我不想这样做,如前所述。确实,如果我安装它,一切正常。

有什么提示吗?

【问题讨论】:

错误是 CLR_E_SHIM_RUNTIMELOAD docs.microsoft.com/en-us/dotnet/framework/deployment/…。你说你已经为 .NET 程序集添加了一个“.config 文件”,但是你必须使用一个 app.config 文件(myprogram.exe.config 文件除了 myprogram.exe) @Simon Mourier 这就是我为 .dll 所做的,我也为 .exe 所做的,但在这种情况下,它实际上不适用于 .exe,因为它不是 .NET。 当然适用。 .dll 没用 那么 *.dll.config 文件的用途是什么,为什么 Visual Studio 会生成它们? @JosephWillcoxson regasm 有一个“regfile”选项来保存一个文本文件,其中包含将对注册表进行的所有更改,而无需实际执行它们。如果您将生成的两个文件与从相同的 .dll .NET 2.0 开始的 regasm 2.0 和 regasm 4.0 进行比较,您会发现它们完全相同。我今天刚试过。 【参考方案1】:

正如@Simon Mourier 在 cmets 中指出的那样,问题是我需要为可执行文件 (myexe.exe.config) 而不是 .NET 程序集 (myassembly .dll.config)。后者其实没用。

【讨论】:

以上是关于Windows 10 中的 CoCreateInstance 错误 0x80131700:无法使用 .NET 运行时 4.0的主要内容,如果未能解决你的问题,请参考以下文章

Windows 10 中的触摸屏友好文件选择器

WINdows10/Chrome 中的 Jquery 自动完成功能

Windows 10 中的 Genymotion 问题

windows10怎么接受虚拟机中的广播?

Windows 10中的Opencv导入问题[重复]

Windows10中的IIS10安装php manager