升级到 Windows 10 版本 1809 SDK 后,我无法编译使用 C++/WinRT 的项目

I can't compile my project which uses C++/WinRT after upgrading to Windows 10, version 1809 SDK

本文关键字:编译 C++ 项目 WinRT Windows 版本 1809 SDK      更新时间:2023-10-16

当我将 Windows SDK 升级到 17763 时,我发现我无法编译我的项目,并且我收到错误消息是"midl:错误MIDL9008:内部编译器问题 - 有关如何找到解决方法的建议,请参阅文档。这是输出:

1>Note: The Microsoft.Windows.CppWinRT Nuget package provides improved C++/WinRT project build support.
1>64 bit MIDLRT Processing G:NagisaRepositoriesNagisaAssassinCustomConverter.idl
1>CustomConverter.idl
1>64 bit MIDLRT Processing C:Program Files (x86)Windows Kits10Include10.0.17763.0winrtwinrtbase.idl
1>winrtbase.idl
1>64 bit MIDLRT Processing C:Program Files (x86)Windows Kits10Include10.0.17763.0winrtmidlbase.idl
1>midlbase.idl
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.ai.machinelearning.machinelearningcontract1.0.0.0windows.ai.machinelearning.machinelearningcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.ai.machinelearning.preview.machinelearningpreviewcontract2.0.0.0windows.ai.machinelearning.preview.machinelearningpreviewcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.applicationmodel.calls.background.callsbackgroundcontract1.0.0.0windows.applicationmodel.calls.background.callsbackgroundcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.applicationmodel.calls.callsphonecontract4.0.0.0windows.applicationmodel.calls.callsphonecontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.applicationmodel.calls.callsvoipcontract4.0.0.0windows.applicationmodel.calls.callsvoipcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.applicationmodel.communicationblocking.communicationblockingcontract2.0.0.0windows.applicationmodel.communicationblocking.communicationblockingcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.applicationmodel.socialinfo.socialinfocontract2.0.0.0windows.applicationmodel.socialinfo.socialinfocontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.applicationmodel.startuptaskcontract3.0.0.0windows.applicationmodel.startuptaskcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.devices.custom.customdevicecontract1.0.0.0windows.devices.custom.customdevicecontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.devices.deviceslowlevelcontract3.0.0.0windows.devices.deviceslowlevelcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.devices.printers.printerscontract1.0.0.0windows.devices.printers.printerscontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.devices.smartcards.smartcardbackgroundtriggercontract3.0.0.0windows.devices.smartcards.smartcardbackgroundtriggercontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.devices.smartcards.smartcardemulatorcontract6.0.0.0windows.devices.smartcards.smartcardemulatorcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.foundation.foundationcontract3.0.0.0windows.foundation.foundationcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.foundation.universalapicontract7.0.0.0windows.foundation.universalapicontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.gaming.xboxlive.storageapicontract1.0.0.0windows.gaming.xboxlive.storageapicontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.graphics.printing3d.printing3dcontract4.0.0.0windows.graphics.printing3d.printing3dcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.networking.connectivity.wwancontract2.0.0.0windows.networking.connectivity.wwancontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.networking.sockets.controlchanneltriggercontract3.0.0.0windows.networking.sockets.controlchanneltriggercontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.services.maps.guidancecontract3.0.0.0windows.services.maps.guidancecontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.services.maps.localsearchcontract4.0.0.0windows.services.maps.localsearchcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.services.store.storecontract4.0.0.0windows.services.store.storecontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.services.targetedcontent.targetedcontentcontract1.0.0.0windows.services.targetedcontent.targetedcontentcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.system.profile.profilehardwaretokencontract1.0.0.0windows.system.profile.profilehardwaretokencontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.system.profile.profilesharedmodecontract2.0.0.0windows.system.profile.profilesharedmodecontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.system.profile.systemmanufacturers.systemmanufacturerscontract3.0.0.0windows.system.profile.systemmanufacturers.systemmanufacturerscontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.system.systemmanagementcontract6.0.0.0windows.system.systemmanagementcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.ui.viewmanagement.viewmanagementviewscalingcontract1.0.0.0windows.ui.viewmanagement.viewmanagementviewscalingcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.ui.xaml.core.direct.xamldirectcontract1.0.0.0windows.ui.xaml.core.direct.xamldirectcontract.winmd
1>64 bit MIDLRT Processing G:NagisaRepositoriesNagisaAssassinTransferManager.idl
1>TransferManager.idl
1>64 bit MIDLRT Processing C:Program Files (x86)Windows Kits10Include10.0.17763.0winrtwinrtbase.idl
1>winrtbase.idl
1>64 bit MIDLRT Processing C:Program Files (x86)Windows Kits10Include10.0.17763.0winrtmidlbase.idl
1>midlbase.idl
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.ai.machinelearning.machinelearningcontract1.0.0.0windows.ai.machinelearning.machinelearningcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.ai.machinelearning.preview.machinelearningpreviewcontract2.0.0.0windows.ai.machinelearning.preview.machinelearningpreviewcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.applicationmodel.calls.background.callsbackgroundcontract1.0.0.0windows.applicationmodel.calls.background.callsbackgroundcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.applicationmodel.calls.callsphonecontract4.0.0.0windows.applicationmodel.calls.callsphonecontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.applicationmodel.calls.callsvoipcontract4.0.0.0windows.applicationmodel.calls.callsvoipcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.applicationmodel.communicationblocking.communicationblockingcontract2.0.0.0windows.applicationmodel.communicationblocking.communicationblockingcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.applicationmodel.socialinfo.socialinfocontract2.0.0.0windows.applicationmodel.socialinfo.socialinfocontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.applicationmodel.startuptaskcontract3.0.0.0windows.applicationmodel.startuptaskcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.devices.custom.customdevicecontract1.0.0.0windows.devices.custom.customdevicecontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.devices.deviceslowlevelcontract3.0.0.0windows.devices.deviceslowlevelcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.devices.printers.printerscontract1.0.0.0windows.devices.printers.printerscontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.devices.smartcards.smartcardbackgroundtriggercontract3.0.0.0windows.devices.smartcards.smartcardbackgroundtriggercontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.devices.smartcards.smartcardemulatorcontract6.0.0.0windows.devices.smartcards.smartcardemulatorcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.foundation.foundationcontract3.0.0.0windows.foundation.foundationcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.foundation.universalapicontract7.0.0.0windows.foundation.universalapicontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.gaming.xboxlive.storageapicontract1.0.0.0windows.gaming.xboxlive.storageapicontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.graphics.printing3d.printing3dcontract4.0.0.0windows.graphics.printing3d.printing3dcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.networking.connectivity.wwancontract2.0.0.0windows.networking.connectivity.wwancontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.networking.sockets.controlchanneltriggercontract3.0.0.0windows.networking.sockets.controlchanneltriggercontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.services.maps.guidancecontract3.0.0.0windows.services.maps.guidancecontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.services.maps.localsearchcontract4.0.0.0windows.services.maps.localsearchcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.services.store.storecontract4.0.0.0windows.services.store.storecontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.services.targetedcontent.targetedcontentcontract1.0.0.0windows.services.targetedcontent.targetedcontentcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.system.profile.profilehardwaretokencontract1.0.0.0windows.system.profile.profilehardwaretokencontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.system.profile.profilesharedmodecontract2.0.0.0windows.system.profile.profilesharedmodecontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.system.profile.systemmanufacturers.systemmanufacturerscontract3.0.0.0windows.system.profile.systemmanufacturers.systemmanufacturerscontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.system.systemmanagementcontract6.0.0.0windows.system.systemmanagementcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.ui.viewmanagement.viewmanagementviewscalingcontract1.0.0.0windows.ui.viewmanagement.viewmanagementviewscalingcontract.winmd
1>Processing WinMD c:program files (x86)windows kits10references10.0.17763.0windows.ui.xaml.core.direct.xamldirectcontract1.0.0.0windows.ui.xaml.core.direct.xamldirectcontract.winmd
1>
1>midl : error MIDL9008: internal compiler problem - See documentation for suggestions on how to find a workaround.
1>midl: Assertion failed: false, file comrpcmidlmidlrtincnodeskl.hxx, line 4884

我试图解决这个问题,如果我删除接口的定义,我发现它将成功编译。但我需要这些定义,因为它很重要。这是我删除的 IDL 定义。

/******************************************************************************
Project: Assassin
Description: Definition for the TransferManager.
File Name: TransferManager.idl
License: The MIT License
******************************************************************************/
namespace Assassin
{
enum TransferTaskStatus
{
Canceled  = 0,
Completed = 1,
Error     = 2,
Paused    = 3,
Queued    = 4,
Running   = 5
};
[version(1.0)]
[uuid(B70ACDED-7354-3082-BF73-D931D80C047B)]
interface ITransferTask : IInspectable
requires Windows.UI.Xaml.Data.INotifyPropertyChanged
{
// Gets the Guid string of the task.
String Guid
{
get;
};
// Gets the URI which to download the file.
Windows.Foundation.Uri SourceUri
{
get;
};
// Gets the file name which to download the file.
String FileName
{
get;
};
// Gets the save file object which to download the file.
Windows.Storage.IStorageFile SaveFile
{
get;
};
// Gets the save folder object which to download the file.
Windows.Storage.IStorageFolder SaveFolder
{
get;
};
// The current status of the task.
TransferTaskStatus Status
{
get;
};
// The total number of bytes received. This value does not include 
// bytes received as response headers. If the task has restarted, 
// this value may be smaller than in the previous progress report.
UInt64 BytesReceived
{
get;
};
// The speed of bytes received in one second.
UInt64 BytesReceivedSpeed
{
get;
};
// The remain time, in seconds.
UInt64 RemainTime
{
get;
};
// The total number of bytes of data to download. If this number is
// unknown, this value is set to 0.
UInt64 TotalBytesToReceive
{
get;
};
// Pauses a download operation.
// Parameters:
//   The function does not have parameters.
// Return value:
//   The function does not return a value.
void Pause();
// Resumes a paused download operation.
// Parameters:
//   The function does not have parameters.
// Return value:
//   The function does not return a value.
void Resume();
// Cancels a download operation.
// Parameters:
//   The function does not have parameters.
// Return value:
//   The function does not return a value.
void Cancel();
}
typedef Windows.Foundation.Collections.IVectorView<ITransferTask> ITransferTaskVector;
[version(1.0)]
[uuid(976D09B5-65EE-39DE-9C00-26E47D6538D7)] 
interface ITransferManager : IInspectable
requires 
Windows.Foundation.IClosable, 
Windows.UI.Xaml.Data.INotifyPropertyChanged
{
// Gets the version of Nagisa.
String Version
{
get;
};
// Gets or sets the filter to use for searching the task list.
String SearchFilter
{
get;
set;
};
// Gets the last used folder.
Windows.Storage.IStorageFolder LastusedFolder
{
get;
};
// Gets or sets the default download folder.
Windows.Storage.IStorageFolder DefaultFolder
{
get;
set;
};
// Gets the total download bandwidth.
UInt64 TotalDownloadBandwidth
{
get;
};
// Gets the total upload bandwidth.
UInt64 TotalUploadBandwidth
{
get;
};
// Gets the task list.
// Parameters:
//   The function does not have parameters.
// Return value:
//   Returns an object which represents the task list.
Windows.Foundation.IAsyncOperation<ITransferTaskVector> GetTasksAsync();
// Add a task to the task list.
// Parameters:
//   SourceUri: The source uri object of task.
//   DesiredFileName: The file name you desire.
//   SaveFolder: The object of the folder which you want to save.
// Return value:
//   Returns an asynchronous object used to wait.
Windows.Foundation.IAsyncAction AddTaskAsync(
Windows.Foundation.Uri SourceUri,
String DesiredFileName,
Windows.Storage.IStorageFolder SaveFolder);
// Removes a task to the task list.
// Parameters:
//   Task: The task object. 
// Return value:
//   Returns an asynchronous object used to wait.
Windows.Foundation.IAsyncAction RemoveTaskAsync(
ITransferTask Task);
// Start all tasks.
// Parameters:
//   The function does not have parameters.
// Return value:
//   The function does not return a value.
void StartAllTasks();
// Pause all tasks.
// Parameters:
//   The function does not have parameters.
// Return value:
//   The function does not return a value.
void PauseAllTasks();
// Clears the task list.
// Parameters:
//   The function does not have parameters.
// Return value:
//   The function does not return a value.
void ClearTaskList();
}
[version(1.0)]
runtimeclass TransferManager :
[default] ITransferManager
{
// Creates a new TransferManager object.
// Parameters:
//   EnableUINotify: Enable the UI notify timer if true. 
// Return value:
//   The function does not return a value.
TransferManager(
Boolean EnableUINotify);
}
}

我想知道是哪个原因造成的,是我的错还是Windows SDK的。

经过几天的思考,试图找到解决方案,

解决方法非常简单:
namespace System {
typedef Windows.Foundation.IClosable IDisposable;
}
namespace MyComponent.MyNamespace {
interface IMyInterface : IInspectable requires System.IDisposable {
...
}
}

上面的 typedef 可以放入单独的共享 .idl 文件中,只要需要外部接口派生,就可以包含该文件。

更新(2020/06/06(:一年和几次SDK更新后,问题仍然存在。 :(

此外,我遇到了一种特定情况,当我的修复效果不佳时 - 当一个 cppwinrt WRC 项目依赖于另一个 cppwinrt WRC 项目时。显然,typedef 在导入的 .winmd 中成为原始类型,因此引用的项目编译良好,但引用项目因相同的旧"内部编译器问题"而失败。不幸的是,您无法使用上述包含来修复它,因为导入的 .winmd 是在项目 .idl 之前处理的。

我已经进一步调查了这个问题,这是我发现的:

  • 错误不仅发生在Windows.Foundation.IClosable本身,而且发生在需求树下某处的任何其他接口
  • 从此类接口派生运行时类时不会发生错误(仅发生在接口"继承"中(
  • 解决方法非常简单且非常相似:如果您键入这样的接口而不是直接使用它 - 一切都会编译得很好。

我想知道是哪个原因造成的,是我的错还是Windows SDK的。

这是最新 Windows SDK 附带的 MIDL 编译器中的一个已知错误。