使用 PublishTrimmed .NET6.0 时 TaskScheduler 中出现 System.NotSupportedException

sta*_*ser 8 .net c# .net-core .net-6.0

我想使用“添加 COM 参考”中的“TaskScheduler 1.1 类型库”来使用 TaskScheduler。

using TaskScheduler;
...
     ITaskService taskservice = null;
     taskservice = new TaskScheduler.TaskScheduler(); <=NotSupportedException
     taskservice.Connect(null, null, null, null);
Run Code Online (Sandbox Code Playgroud)

但上面的代码会引发异常。

System.NotSupportedException:“内置 COM 已通过功能开关禁用。请参阅https://aka.ms/dotnet-illink/com了解更多信息

如果 PublishTrimmed 设置为 false,则不会引发异常。但是,我不想将其设置为 false,因为它会增加 exe 的大小。

项目文件如下

 <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <PublishSingleFile>true</PublishSingleFile>
    <SelfContained>false</SelfContained>
    <PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

我尝试将程序集添加到 TrimmerRootAssembly。但以下不起作用。

<ItemGroup>
    <TrimmerRootAssembly Include="TaskScheduler" />
    <TrimmerRootAssembly Include="Microsoft.Win32.TaskScheduler" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

小智 11

似乎由于 COM 引用的修剪可能会导致问题,默认情况下它已被禁用。您可以通过添加到csproj 文件中来
重新启用它。<BuiltInComInteropSupport>true</BuiltInComInteropSupport>PropertyGroup

您还可以使用 ComWrappers 在 .NET 5 中获得正确的 AOT 互操作解决方案 - https://learn.microsoft.com/en-us/dotnet/standard/native-interop/tutorial-comwrappers