Skip to content

Conversation

@steveisok
Copy link
Member

@steveisok steveisok commented Aug 2, 2022

Inadvertently put in a condition that only made tests with this check run in NativeAOT. The intent was to skip on both NativeAOT and Mono AOT.

Inadvertently put in a condition that only made tests with this check run in NativeAOT. The intent was to skip on both NativeAOT and Mono AOT.

Also, changed the name from IsNonBundledAssemblyLoadingSupported to IsAssemblyLoadingFromFileSupported for better clarity.
@ghost
Copy link

ghost commented Aug 2, 2022

I couldn't figure out the best area label to add to this PR. If you have write-permissions please help me learn by adding exactly one area label.


public static bool IsAssemblyLoadingSupported => !IsNativeAot;
public static bool IsNonBundledAssemblyLoadingSupported => !IsAssemblyLoadingSupported && !IsMonoAOT;
public static bool IsAssemblyLoadingFromFileSupported => IsAssemblyLoadingSupported && !IsMonoAOT;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm curious what's different between Native AOT and Mono's AOT that the former is able to support loading assemblies from files and the latter isn't?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In full AOT for mono, assembly loading is allowed, but in the case I'm trying to skip, the exe assembly wasn't AOT'd and was not registered as a module on startup. For NativeAOT, my understanding is everything compiles into a single binary. That means you can't load anything external.

I kept going back and forth on a proper name for the property. I reverted back to what I originally had as I now think it's a little more accurate.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In NativeAOT, Assembly.Load works too because that one is not actually loading anything new. The assembly was part of the app.

Assembly.LoadFrom or loading from byte array don't work and are blocked on the existing condition. Does it match your semantic?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Close. I say that because tests like this pass:

public static void TestingCreateInstanceFromObjectHandle(string assemblyFile, string type, string returnedFullNameType, Type exceptionType)
{
ObjectHandle oh = null;
if (exceptionType != null)
{
Assert.Throws(exceptionType, () => Activator.CreateInstanceFrom(assemblyFile: assemblyFile, typeName: type));
}
else
{
oh = Activator.CreateInstanceFrom(assemblyFile: assemblyFile, typeName: type);
CheckValidity(oh, returnedFullNameType);
}
if (exceptionType != null)
{
Assert.Throws(exceptionType, () => Activator.CreateInstanceFrom(assemblyFile: assemblyFile, typeName: type, null));
}
else
{
oh = Activator.CreateInstanceFrom(assemblyFile: assemblyFile, typeName: type, null);
CheckValidity(oh, returnedFullNameType);
}
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll leave it up to you, but I would expect that API to be unsupported in general. It might work in corner cases like in the test but it's a much easier story to say to customers that apis that load assemblies from files are not supported than to have an asterisk with when it is supported. Especially if there's perfectly good replacement apis like CreateInstance(string,string).

Apis that are unsupported don't need test coverage.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tagging @lambdageek in the event I didn't explain it quite right.

Copy link
Member

@mdh1418 mdh1418 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The thing that isn't supported, is it specifically loading an assembly from a file on mono, or is it the assembly execution from a file on mono that is not supported? Isn't this AssemblyLoading from a file as well

?

@MichalStrehovsky
Copy link
Member

The thing that isn't supported, is it specifically loading an assembly from a file on mono, or is it the assembly execution from a file on mono that is not supported? Isn't this AssemblyLoading from a file as well

This one is in the same category as the Activator.CreateInstanceFrom case above - it's loading a file, but the file happens to be part of the app, so it probably works.

The problem (and test hole) is that the tests are not testing the primary customer scenario for various LoadFrom APIs - the APIs are meant for e.g. a plugin that wasn't part of the app.

If we were to adapt the tests to test the primary customer scenarios and not the corner case that happens to work (the loaded assembly was part of the app already), annotating these tests as PlatformDetection.IsAssemblyLoadingSupported and saying that loading assemblies from files is not supported on Mono AOT (even though it might work, but it's not tested) would be a good fix. I'm not sure introducing new PlatformDetection just to keep test coverage for what is actually a non-mainstream scenario has a lot of value.

But don't consider this feedback blocking. What is here works too.

@steveisok steveisok merged commit 6e07ea4 into dotnet:main Aug 3, 2022
@steveisok steveisok deleted the fix-condition branch August 3, 2022 18:38
@ghost ghost locked as resolved and limited conversation to collaborators Sep 2, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants