diff --git a/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs b/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs index 7d8ad8f49a8..c96effb5b2c 100644 --- a/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs +++ b/src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs @@ -8,6 +8,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.Loader; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; @@ -49,6 +50,7 @@ using DynamoServices; using DynamoUtilities; using ICSharpCode.AvalonEdit; +using J2N.Text; using Newtonsoft.Json; using PythonNodeModels; using ISelectable = Dynamo.Selection.ISelectable; @@ -840,14 +842,16 @@ private void CrashGracefully(Exception ex, bool fatal = false) { try { - if (!fatal) + var exceptionAssembly = ex.TargetSite?.Module?.Assembly; + // Do not crash if the exception is coming from a 3d party package; + if (!fatal && exceptionAssembly != null) { // Check if the exception might be coming from a loaded package assembly. - var faultyPkg = Model.GetPackageManagerExtension()?.PackageLoader?.LocalPackages?.FirstOrDefault(p => - { - // Find the first assembly that was loaded fromm the package folder and has the same name as the exception source. - return p.LoadedAssemblies.FirstOrDefault(a => a.WasLoadedFromPackage && (a.Name == ex.Source)) != null; - }); + var faultyPkg = Model.GetPackageManagerExtension()?.PackageLoader?.LocalPackages?.FirstOrDefault(p => + { + return exceptionAssembly.Location.StartsWith(p.RootDirectory, StringComparison.OrdinalIgnoreCase); + } + ); if (faultyPkg != null) { var crashDetails = new CrashErrorReportArgs(ex); diff --git a/src/DynamoPackages/Package.cs b/src/DynamoPackages/Package.cs index 5ff49965b8e..ecbe62c7fa7 100644 --- a/src/DynamoPackages/Package.cs +++ b/src/DynamoPackages/Package.cs @@ -24,9 +24,6 @@ public class PackageAssembly public bool IsNodeLibrary { get; set; } public Assembly Assembly { get; set; } public string LocalFilePath {get;set;} - // WasLoadedFromPackage is a flag that represents if the Assembly was actually loaded from the package folder (value = true) - // or if the assembly was already loaded in the appdomain (value = false) - internal bool WasLoadedFromPackage { get; set; } public string Name { @@ -361,14 +358,7 @@ internal IEnumerable EnumerateAndLoadAssembliesInBinDirectory() // Use the pkg header to determine which assemblies to load and prevent multiple enumeration // In earlier packages, this field could be null, which is correctly handled by IsNodeLibrary var nodeLibraries = Header.node_libraries; - - List appDomainAssemblies = null; - var binFiles = new DirectoryInfo(BinaryDirectory).EnumerateFiles("*.dll"); - if (binFiles.Any()) { - appDomainAssemblies = AppDomain.CurrentDomain.GetAssemblies().Select(x => x.GetName().Name).ToList(); - } - - foreach (var assemFile in binFiles) + foreach (var assemFile in new DirectoryInfo(BinaryDirectory).EnumerateFiles("*.dll")) { Assembly assem; //TODO when can we make this false. 3.0? @@ -384,16 +374,13 @@ internal IEnumerable EnumerateAndLoadAssembliesInBinDirectory() var result = PackageLoader.TryLoadFrom(assemFile.FullName, out assem); if (result) { - bool alreadyLoaded = appDomainAssemblies?.Contains(assemFile.Name) ?? false; - // IsNodeLibrary may fail, we store the warnings here and then show IList warnings = new List(); assemblies.Add(new PackageAssembly() { Assembly = assem, - IsNodeLibrary = IsNodeLibrary(nodeLibraries, assem.GetName(), ref warnings), - WasLoadedFromPackage = !alreadyLoaded, + IsNodeLibrary = IsNodeLibrary(nodeLibraries, assem.GetName(), ref warnings) }); warnings.ToList().ForEach(this.Log);