Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[build] Allow Assembly "vendorization" #136

Merged
merged 1 commit into from
Sep 27, 2021

Conversation

jonpryor
Copy link
Member

Context: ff73f92
Context: 061bcc2
Context: https://github.com/xamarin/XamarinVS/pull/12550

Changing $(Version) with every commit is fun and all, but doesn't
solve all problems. Commit ff73f92 works "nicely" for MSBuild tasks
via <UsingTask/>. It doesn't work as well for "normal"
assembly references in a "normal" AppDomain context, because
assemblies are normally resolved via "assembly base name", not
the full path name including directory.

Thus, given Example.dll:

csc /out:Example.dll /r:Path/To/Xamarin.Android.Tools.AndroidSdk.dll

then when Example.dll is loaded, it will try to load
Xamarin.Android.Tools.AndroidSdk via a Load-by-name method, and
will load the first Xamarin.Android.Tools.AndroidSdk.dll loaded
into the AppDomain/AssemblyLoadContext, regardless of version.

There may not be a good way to control what that assembly is.

This causes grief with our peer IDE teams, as assembly versions are
still checked, but on mismatch an exception is thrown (!).

Commit 061bcc2 was an attempt to address this, but proved to be
incomplete.

Attempt to improve matters by introducing a "vendorization" protocol:

  1. Update Directory.Build.props to import
    "parent directory.override.props", so that a "parent checkout"
    can easily override MSBuild properties.

  2. Update the *.csproj files so that $(AssemblyName) is forced
    to start with $(VendorPrefix), and end with $(VendorSuffix).

This allows a parent checkout to set the $(VendorPrefix) and
$(VendorSuffix) properties, which will impact the assembly filenames
of all assemblies built in xamarin-android-tools.

Context: ff73f92
Context: 061bcc2
Context: xamarin/XamarinVS#12550

Changing `$(Version)` with every commit is fun and all, but doesn't
solve all problems.  Commit ff73f92 works "nicely" for MSBuild tasks
via [`<UsingTask/>`][0].  It doesn't work as well for "normal"
assembly references in a "normal" AppDomain context, because
assemblies are [normally resolved][1] via "assembly base name", *not*
the full path name including directory.

Thus, given `Example.dll`:

	csc /out:Example.dll /r:Path/To/Xamarin.Android.Tools.AndroidSdk.dll

then when `Example.dll` is loaded, it will try to load
`Xamarin.Android.Tools.AndroidSdk` via a `Load-by-name` method, and
will load the first `Xamarin.Android.Tools.AndroidSdk.dll` loaded
into the `AppDomain`/`AssemblyLoadContext`, regardless of version.

There may not be a good way to control what that assembly *is*.

This causes grief with our peer IDE teams, as assembly versions are
still checked, but on mismatch an exception is thrown (!).

Commit 061bcc2 was an attempt to address this, but proved to be
incomplete.

Attempt to improve matters by introducing a "vendorization" protocol:

 1. Update `Directory.Build.props` to import
    "parent directory.override.props", so that a "parent checkout"
    can easily override MSBuild properties.

 2. Update the `*.csproj` files so that `$(AssemblyName)` is forced
    to start with `$(VendorPrefix)`, and end with `$(VendorSuffix)`.

This allows a parent checkout to set the `$(VendorPrefix)` and
`$(VendorSuffix)` properties, which will impact the assembly filenames
of all assemblies built in xamarin-android-tools.

[0]: https://docs.microsoft.com/en-us/visualstudio/msbuild/usingtask-element-msbuild?view=vs-2019
[1]: https://docs.microsoft.com/en-us/dotnet/core/dependency-loading/loading-managed
@jonpryor jonpryor force-pushed the jonp-assembly-vendorize-support branch from d7aa030 to 3cdae1d Compare September 27, 2021 21:43
@BretJohnson BretJohnson self-requested a review September 27, 2021 22:04
@jonpryor jonpryor merged commit 34e98e2 into dotnet:main Sep 27, 2021
BretJohnson pushed a commit that referenced this pull request Oct 1, 2021
Context: ff73f92
Context: 061bcc2
Context: xamarin/XamarinVS#12550

Changing `$(Version)` with every commit is fun and all, but doesn't
solve all problems.  Commit ff73f92 works "nicely" for MSBuild tasks
via [`<UsingTask/>`][0].  It doesn't work as well for "normal"
assembly references in a "normal" AppDomain context, because
assemblies are [normally resolved][1] via "assembly base name", *not*
the full path name including directory.

Thus, given `Example.dll`:

	csc /out:Example.dll /r:Path/To/Xamarin.Android.Tools.AndroidSdk.dll

then when `Example.dll` is loaded, it will try to load
`Xamarin.Android.Tools.AndroidSdk` via a `Load-by-name` method, and
will load the first `Xamarin.Android.Tools.AndroidSdk.dll` loaded
into the `AppDomain`/`AssemblyLoadContext`, regardless of version.

There may not be a good way to control what that assembly *is*.

This causes grief with our peer IDE teams, as assembly versions are
still checked, but on mismatch an exception is thrown (!).

Commit 061bcc2 was an attempt to address this, but proved to be
incomplete.

Attempt to improve matters by introducing a "vendorization" protocol:

 1. Update `Directory.Build.props` to import
    "parent directory.override.props", so that a "parent checkout"
    can easily override MSBuild properties.

 2. Update the `*.csproj` files so that `$(AssemblyName)` is forced
    to start with `$(VendorPrefix)`, and end with `$(VendorSuffix)`.

This allows a parent checkout to set the `$(VendorPrefix)` and
`$(VendorSuffix)` properties, which will impact the assembly filenames
of all assemblies built in xamarin-android-tools.

[0]: https://docs.microsoft.com/en-us/visualstudio/msbuild/usingtask-element-msbuild?view=vs-2019
[1]: https://docs.microsoft.com/en-us/dotnet/core/dependency-loading/loading-managed
BretJohnson pushed a commit that referenced this pull request Oct 1, 2021
Context: ff73f92
Context: 061bcc2
Context: xamarin/XamarinVS#12550

Changing `$(Version)` with every commit is fun and all, but doesn't
solve all problems.  Commit ff73f92 works "nicely" for MSBuild tasks
via [`<UsingTask/>`][0].  It doesn't work as well for "normal"
assembly references in a "normal" AppDomain context, because
assemblies are [normally resolved][1] via "assembly base name", *not*
the full path name including directory.

Thus, given `Example.dll`:

	csc /out:Example.dll /r:Path/To/Xamarin.Android.Tools.AndroidSdk.dll

then when `Example.dll` is loaded, it will try to load
`Xamarin.Android.Tools.AndroidSdk` via a `Load-by-name` method, and
will load the first `Xamarin.Android.Tools.AndroidSdk.dll` loaded
into the `AppDomain`/`AssemblyLoadContext`, regardless of version.

There may not be a good way to control what that assembly *is*.

This causes grief with our peer IDE teams, as assembly versions are
still checked, but on mismatch an exception is thrown (!).

Commit 061bcc2 was an attempt to address this, but proved to be
incomplete.

Attempt to improve matters by introducing a "vendorization" protocol:

 1. Update `Directory.Build.props` to import
    "parent directory.override.props", so that a "parent checkout"
    can easily override MSBuild properties.

 2. Update the `*.csproj` files so that `$(AssemblyName)` is forced
    to start with `$(VendorPrefix)`, and end with `$(VendorSuffix)`.

This allows a parent checkout to set the `$(VendorPrefix)` and
`$(VendorSuffix)` properties, which will impact the assembly filenames
of all assemblies built in xamarin-android-tools.

[0]: https://docs.microsoft.com/en-us/visualstudio/msbuild/usingtask-element-msbuild?view=vs-2019
[1]: https://docs.microsoft.com/en-us/dotnet/core/dependency-loading/loading-managed
BretJohnson added a commit that referenced this pull request Oct 1, 2021
[d17-0][build] Allow Assembly "vendorization" (#136)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants