以下代码尝试以编程方式构建解决方案,使用BuildManager:
ProjectCollection pc = new ProjectCollection();
pc.DefaultToolsVersion = "12.0";
pc.Loggers.Add(fileLogger);
Dictionary<string, string> globalProperty = new Dictionary<string, string>();
BuildRequestData buildRequest = new BuildRequestData(solutionName, globalProperty, null, new[] { "Build" }, null);
BuildParameters buildParameters = new BuildParameters(pc)
{
DefaultToolsVersion = "12.0",
OnlyLogCriticalEvents = false,
DetailedSummary = true,
Loggers = new List<Microsoft.Build.Framework.ILogger> { fileLogger }.AsEnumerable()
};
var result = BuildManager.DefaultBuildManager.Build(buildParameters, buildRequest);
Run Code Online (Sandbox Code Playgroud)
当我运行此代码(它没有构建任何btw)时,我可以看到csc.exe除了一个特定版本之外还使用了以下编译器winmdexp.exe:
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Csc.exe
ExportWindowsMDFile:
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\winmdexp.exe
Run Code Online (Sandbox Code Playgroud)
但是当我使用VS IDE成功构建解决方案时,会出现以下信息:
C:\Program Files (x86)\MSBuild\12.0\bin\Csc.exe
ExportWindowsMDFile:
C:\Program Files …Run Code Online (Sandbox Code Playgroud) WinMD 是一个二进制数据文件,其中包含您需要了解的有关本地 WinRT dll 中可用的命名空间、类型、类、方法和参数的所有信息。
Windows 运行时使用 API 元数据(.winmd 文件)公开。这与 .NET 框架 (Ecma-335) 使用的格式相同。底层二进制合同使您可以轻松地直接使用您选择的开发语言访问 Windows 运行时 API。
每个 .winmd 文件公开一个或多个命名空间。这些命名空间按它们提供的功能分组。命名空间包含类、结构和枚举等类型。
伟大的; 我如何访问它?
引擎盖下的 WinRT 仍然是 COM。WinRT 中的 Winmd(Windows 元数据)是来自 COM 的旧 TLB(类型库)文件的现代版本。
| COM | WinRT |
|----------------------------|--------------------------------|
| CoInitialize | RoInitialize |
| CoCreateInstance(ProgID)¹ | RoActivateInstance(ClassName) |
| *.tlb | *.winmd |
| compiled from idl | compiled from idl |
| HKCR\Classes\[ProgID] | HKLM\Software\Microsoft\WindowsRuntime\ActivatableClassId\[ClassName] |
| Code stored in …Run Code Online (Sandbox Code Playgroud) 我已经构建了一个WinRT组件(.winmd)供JavaScript和XAML Windows Store应用程序使用.在JavaScript客户端中包含和引用松散的.winmd文件输出时,我看到此构建警告:
Microsoft.AppXPackage.Targets(808,9):警告APPX1707:没有为.winmd文件'myRuntimeComponent.winmd'提供实现文件.要在应用清单中生成注册信息,请在项目文件中的.winmd引用项上指定"实现"元数据.
我找不到有关此错误的任何文档或如何包含实现元数据.
运行JavaScript客户端时,调用从.winmd导出的类方法时抛出此异常:
0x80040154 - JavaScript运行时错误:未注册类
请注意,我在客户端应用程序项目中引用松散的.winmd文件,而不是引用构建.winmd的Visual Studio项目.我的用例是分发.winmd输出,而不是.winmd组件的完整源代码 - 源代码分发不是一个选项.
另请注意,当Windows运行时组件作为项目引用引用时,JavaScript客户端将构建并正确运行.C#XAML客户端可以使用项目引用或对松散.winmd的引用正确运行.
当引用松散的.winmd时,似乎在客户端应用程序构建中没有生成某些注册信息.
如何构建和分发松散的Windows运行时组件以供JavaScript和托管客户端使用?
我有一个问题,给定一个.winmd文件,我们在哪里可以找到真正的实现?.winmd文件就像一个头文件或动态库的.lib文件,它不包含任何实现,我很好奇它的实现在哪里.谢谢.
我创建了一个 C# .Net Standard 库,它引用了两个 Windows SDK 库。
参考文献是
C:\Program Files (x86)\Windows Kits\10\References\10.0.16299.0\Windows.Foundation.FoundationContract\3.0.0.0\Windows.Foundation.FoundationContract.winmdC:\Program Files (x86)\Windows Kits\10\References\10.0.16299.0\Windows.Foundation.UniversalApiContract\5.0.0.0\Windows.Foundation.UniversalApiContract.winmd这适用于我的本地开发机器。
VS Team Services 构建首先显示以下警告:
2018-06-13T01:17:22.3393846Z ##[warning]C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets(2106,5): Warning MSB3245: Could not resolve this reference. Could not locate the assembly "Windows.Foundation.FoundationContract". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
后来它失败并出现以下错误:
Error CS0246: The type or namespace name 'Windows' could not be found (are you missing a …
我想使用 winfbsdk(请参阅此处),这是一个用于在 UWP(通用 Windows 应用程序 (Windows 10))内使用 Facebook 的 SDK。但似乎.winmd构建的文件不足以使用该库。我可以执行以下操作之一:
或者
.winmd文件,同时复制生成的.DLL文件.pri。为什么是这样?