|
17 | 17 | using BIDSHelper.Core.Logger; |
18 | 18 | using Task = System.Threading.Tasks.Task; |
19 | 19 |
|
| 20 | +using System.Runtime.CompilerServices; |
| 21 | +using System.Runtime.InteropServices; |
| 22 | + |
| 23 | +namespace mscoree |
| 24 | +{ |
| 25 | + [CompilerGenerated] |
| 26 | + [Guid("CB2F6722-AB3A-11D2-9C40-00C04FA30A3E")] |
| 27 | + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] |
| 28 | + [TypeIdentifier] |
| 29 | + [ComImport] |
| 30 | + [CLSCompliant(false)] |
| 31 | + public interface ICorRuntimeHost |
| 32 | + { |
| 33 | + void _VtblGap1_11(); |
| 34 | + |
| 35 | + void EnumDomains(out IntPtr enumHandle); |
| 36 | + |
| 37 | + void NextDomain([In] IntPtr enumHandle, [MarshalAs(UnmanagedType.IUnknown)] out object appDomain); |
| 38 | + |
| 39 | + void CloseEnum([In] IntPtr enumHandle); |
| 40 | + } |
| 41 | +} |
| 42 | + |
20 | 43 | namespace BIDSHelper |
21 | 44 | { |
22 | 45 |
|
@@ -686,6 +709,45 @@ System.Reflection.Assembly currentDomain_AssemblyResolve(object sender, ResolveE |
686 | 709 | string _recursiveAssemblyResolveNameToSkip = null; |
687 | 710 | System.Collections.Generic.List<string> _assemblyLoadsFailed = new System.Collections.Generic.List<string>(); |
688 | 711 | System.Collections.Generic.List<System.ResolveEventHandler> _microsoftEventHandlersToIgnoreErrors = new System.Collections.Generic.List<ResolveEventHandler>(); |
| 712 | + AppDomain _defaultAppDomain = null; |
| 713 | + |
| 714 | + private static mscoree.ICorRuntimeHost GetCorRuntimeHost() |
| 715 | + { |
| 716 | + return (mscoree.ICorRuntimeHost)Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid("CB2F6723-AB3A-11D2-9C40-00C04FA30A3E"))); |
| 717 | + } |
| 718 | + |
| 719 | + public AppDomain GetDefaultAppDomain() |
| 720 | + { |
| 721 | + IntPtr enumHandle = IntPtr.Zero; |
| 722 | + mscoree.ICorRuntimeHost host = GetCorRuntimeHost(); |
| 723 | + try |
| 724 | + { |
| 725 | + host.EnumDomains(out enumHandle); |
| 726 | + |
| 727 | + object domain = null; |
| 728 | + while (true) |
| 729 | + { |
| 730 | + host.NextDomain(enumHandle, out domain); |
| 731 | + |
| 732 | + if (domain == null) break; |
| 733 | + |
| 734 | + AppDomain appDomain = (AppDomain)domain; |
| 735 | + if (appDomain.IsDefaultAppDomain()) |
| 736 | + return appDomain; |
| 737 | + } |
| 738 | + return null; |
| 739 | + } |
| 740 | + catch (Exception e) |
| 741 | + { |
| 742 | + Log.Debug("Caught error in Microsoft AssemblyResolve and skipped: " + e.Message); |
| 743 | + return null; |
| 744 | + } |
| 745 | + finally |
| 746 | + { |
| 747 | + host.CloseEnum(enumHandle); |
| 748 | + Marshal.ReleaseComObject(host); |
| 749 | + } |
| 750 | + } |
689 | 751 |
|
690 | 752 | /// <summary> |
691 | 753 | /// Only fires if an assembly fails to load. This gives us a chance to redirect to a DLL that does exist. |
@@ -732,9 +794,22 @@ System.Reflection.Assembly currentDomain_AssemblyResolve(object sender, ResolveE |
732 | 794 | { |
733 | 795 | if (loadedAlready.GetName().Name == assemblyname.Name |
734 | 796 | && loadedAlready.GetName().Version.Major == assemblyname.Version.Major) |
| 797 | + //&& loadedAlready.GetName().Version.Minor == assemblyname.Version.Minor |
| 798 | + //&& loadedAlready.GetName().Version.MinorRevision == assemblyname.Version.MinorRevision) |
735 | 799 | return loadedAlready; |
736 | 800 | } |
737 | 801 |
|
| 802 | + //if (_defaultAppDomain == null) |
| 803 | + // _defaultAppDomain = GetDefaultAppDomain(); |
| 804 | + //foreach (Assembly loadedAlready in _defaultAppDomain.GetAssemblies()) |
| 805 | + //{ |
| 806 | + // if (loadedAlready.GetName().Name == assemblyname.Name |
| 807 | + // && loadedAlready.GetName().Version.Major == assemblyname.Version.Major |
| 808 | + // && loadedAlready.GetName().Version.Minor == assemblyname.Version.Minor |
| 809 | + // && loadedAlready.GetName().Version.MinorRevision == assemblyname.Version.MinorRevision) |
| 810 | + // return loadedAlready; |
| 811 | + //} |
| 812 | + |
738 | 813 | System.Collections.Generic.List<string> pathsToCheck = new System.Collections.Generic.List<string>(); |
739 | 814 | var bidsHelperPath = new System.IO.FileInfo(typeof(BIDSHelperPackage).Assembly.Location); |
740 | 815 | pathsToCheck.Add(bidsHelperPath.DirectoryName + "\\"); |
|
0 commit comments