Get rid of ILMerge, use more friendly ILBundle

This commit is contained in:
JustArchi
2015-12-19 08:22:17 +01:00
parent c09af9b937
commit 43264e77b2
11 changed files with 153 additions and 3 deletions

View File

@@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace $rootnamespace$
{
public static class ILBundle
{
public static List<String> ResourceNames = new List<string>();
public static Assembly ExecutingAssembly;
static ILBundle()
{
ExecutingAssembly = Assembly.GetExecutingAssembly();
ResourceNames = ExecutingAssembly.GetManifestResourceNames().Where(n => n.EndsWith(".dll") || n.EndsWith(".exe")).ToList();
}
public static void RegisterAssemblyResolver()
{
AppDomain.CurrentDomain.AssemblyResolve += (s, assembly) =>
{
var assemblyName = new AssemblyName(assembly.Name);
var paths = new List<string>{
string.Format("{0}.dll", assemblyName.Name),
string.Format("{0}.exe", assemblyName.Name)
};
foreach(var path in paths)
{
if (ResourceNames.Contains(path))
{
using (var stream = ExecutingAssembly.GetManifestResourceStream(path))
{
if (stream == null)
return null;
var bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
try
{
return Assembly.Load(bytes);
}
catch (Exception ex)
{
System.Diagnostics.Debug.Print("Failed to load: {0}, Exception: {1}", path, ex.Message);
}
}
}
}
return null;
};
}
}
}

View File

@@ -0,0 +1,9 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="AfterResolveReferences">
<ItemGroup>
<EmbeddedResource Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.Extension)' == '.dll'">
<LogicalName>%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
</EmbeddedResource>
</ItemGroup>
</Target>
</Project>

Binary file not shown.

View File

@@ -0,0 +1,11 @@
#http://blogs.clariusconsulting.net/kzu/how-to-add-an-msbuild-import-to-a-project-on-nuget-install/
param($installPath, $toolsPath, $package, $project)
# Need to load MSBuild assembly if it<69>s not loaded yet.
Add-Type -AssemblyName 'Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
# Grab the loaded MSBuild project for the project
$msbuild = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection.GetLoadedProjects($project.FullName) | Select-Object -First 1
$importToRemove = $msbuild.Xml.Imports | Where-Object { $_.Project.Endswith('ILBundle.targets') }
# Remove the import and save the project
$msbuild.Xml.RemoveChild($importToRemove) | out-null
$project.Save()

View File

@@ -0,0 +1,17 @@
# http://blogs.clariusconsulting.net/kzu/how-to-add-an-msbuild-import-to-a-project-on-nuget-install/
param($installPath, $toolsPath, $package, $project)
# This is the MSBuild targets file to add
$targetsFile = [System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($project.FileName), 'ILBundle.targets')
# Need to load MSBuild assembly if it's not loaded yet.
Add-Type -AssemblyName 'Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
# Grab the loaded MSBuild project for the project
$msbuild = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection.GetLoadedProjects($project.FullName) | Select-Object -First 1
# Make the path to the targets file relative.
$projectUri = new-object Uri('file://' + $project.FullName)
$targetUri = new-object Uri('file://' + $targetsFile)
$relativePath = $projectUri.MakeRelativeUri($targetUri).ToString().Replace([System.IO.Path]::AltDirectorySeparatorChar, [System.IO.Path]::DirectorySeparatorChar)
# Add the import and save the project
$msbuild.Xml.AddImport($relativePath) | out-null
$project.Save()