dotnet / runtime

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.
https://docs.microsoft.com/dotnet/core/
MIT License
15.22k stars 4.72k forks source link

System.Management.WbemDefPath doesn't work with trimming #61960

Open Symbai opened 2 years ago

Symbai commented 2 years ago

Description

NativeAOT (the trimming?) breaks the body of System.Management.WbemDefPath..ctor():

 ---> System.InvalidProgramException: Common Language Runtime detected an invalid program. The body of method 'Void System.Management.WbemDefPath..ctor()' is invalid.
   at Internal.Runtime.TypeLoaderExceptionHelper.CreateInvalidProgramException(ExceptionStringID, String) + 0x40
   at Internal.Runtime.CompilerHelpers.ThrowHelpers.ThrowInvalidProgramExceptionWithArgument(ExceptionStringID, String) + 0x9
   at System.Management.WbemDefPath..ctor() + 0x15

I'm reporting this here since NativeAOT will be moved into this repo anyway and it's probably a trimming issue? in which case it belongs to this repo.

Reproduction Steps

In nativeAOT project:

ManagementClass managementClass = new ManagementClass("Win32_BaseBoard");
var instances = managementClass.GetInstances();
foreach (var obj in instances)
{
    //...
}

In C# project call the export function of the nativeAOT project which executes the code above.

Expected behavior

No exception

Actual behavior

Exception

Regression?

No response

Known Workarounds

No response

Configuration

No response

Other information

It's a windows x64 DLL project publishing using /p:NativeLib=Shared, I'm using NativeAOT compiler nuget version 6.0.0-*

hez2010 commented 2 years ago

NativeAOT compiler 6.0.0-* is out-of-date and missing plenty of fixes, can you try again with 7.0.0-*?

MichalStrehovsky commented 2 years ago

WbemDefPath is built-in COM. This doesn't work with trimming in general and NativeAOT implies trimming. It will have to be converted to ComWrappers.

ghost commented 2 years ago

Tagging subscribers to 'linkable-framework': @eerhardt, @vitek-karas, @LakshanF, @sbomer, @joperezr See info in area-owners.md if you want to be subscribed.

Issue Details
### Description NativeAOT (the trimming?) breaks the body of System.Management.WbemDefPath..ctor(): ``` ---> System.InvalidProgramException: Common Language Runtime detected an invalid program. The body of method 'Void System.Management.WbemDefPath..ctor()' is invalid. at Internal.Runtime.TypeLoaderExceptionHelper.CreateInvalidProgramException(ExceptionStringID, String) + 0x40 at Internal.Runtime.CompilerHelpers.ThrowHelpers.ThrowInvalidProgramExceptionWithArgument(ExceptionStringID, String) + 0x9 at System.Management.WbemDefPath..ctor() + 0x15 ``` I'm reporting this here since NativeAOT will be moved into this repo anyway and it's probably a trimming issue? in which case it belongs to this repo. ### Reproduction Steps In nativeAOT project: ```C# ManagementClass managementClass = new ManagementClass("Win32_BaseBoard"); var instances = managementClass.GetInstances(); foreach (var obj in instances) { //... } ``` In C# project call the export function of the nativeAOT project which executes the code above. ### Expected behavior No exception ### Actual behavior Exception ### Regression? _No response_ ### Known Workarounds _No response_ ### Configuration _No response_ ### Other information It's a windows x64 DLL project publishing using `/p:NativeLib=Shared`, I'm using NativeAOT compiler nuget version `6.0.0-*`
Author: Symbai
Assignees: -
Labels: `area-System.Management`, `untriaged`, `linkable-framework`
Milestone: -
Symbai commented 2 years ago

NativeAOT compiler 6.0.0-* is out-of-date and missing plenty of fixes, can you try again with 7.0.0-*?

Unfortunately not, see https://github.com/dotnet/runtimelab/issues/1748

eerhardt commented 2 years ago

If anyone is looking to pick this up and needs an example of how to convert to COMWrappers, here are the PRs that converted System.Drawing.Common to use COMWrappers. They may be useful to get started on how to do it.

https://github.com/dotnet/runtime/pull/54636 https://github.com/dotnet/runtime/pull/54884

Also, check out the docs here: https://docs.microsoft.com/en-us/dotnet/standard/native-interop/tutorial-comwrappers

ivanjx commented 1 year ago

are there any workarounds on how to make system.management to work with nativeaot for now?

MichalStrehovsky commented 1 year ago

It's the same problem as #78038 that was recently closed but had a couple other people. System.Management needs to be converted to ComWrappers. It's starting to be a pretty popular request. Cc @jkoritzinsky if this is something that could be addressed with the COM source generator for .NET 8.

ivanjx commented 1 year ago

i managed to workaround using powershell.exe with Get-WmiObject command but indeed being able to do more advanced querying and not needing to parse the text output manually is preferred.

brandon3343 commented 1 year ago

@ivanjx You can try WmiLight, It works for me.

MattHyman commented 23 hours ago

A project I work on recently hit this with ManagementEventWatcher and we were unaware of the lack of trim suport until testing on release bits as only trim was enabled there. I would have expected this to repro on debug bits as we were following documentation to avoid diverged behavior on debug/release for trim.

Until this is fixed it would be great if the issue was more discoverable and not a debug/release behavior divergence.

MichalStrehovsky commented 8 hours ago

and we were unaware of the lack of trim suport until testing on release bits as only trim was enabled there

Does your project have <PublishTrimmed>true</PublishTrimmed> in the project file, or do you only add it as part of publish command line (or with a publish profile)? The preference is to have this in the csproj because it enables emulation of trimming behaviors in Debug builds as well - if PublishTrimmed is enabled, COM interop is disabled and you should see the same exception at runtime.

But I agree that we should either make System.Management trim safe with COM source generator, or annotate it as trim unfriendly so that the Roslyn analyzer can flag this.