From c08b9b2f1144b115910ae952e8c15353083e8807 Mon Sep 17 00:00:00 2001 From: Chuong Ho <31106432+chuongmep@users.noreply.github.com> Date: Fri, 20 May 2022 11:07:26 +0700 Subject: [PATCH] resolve assembly conflic pdb autocad vs civil3d --- CadAddinManager/Model/AssemLoader.cs | 44 +++++++++++++++++------ CadAddinManager/ViewModel/AddinManager.cs | 3 +- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/CadAddinManager/Model/AssemLoader.cs b/CadAddinManager/Model/AssemLoader.cs index 650bdef..78a018b 100644 --- a/CadAddinManager/Model/AssemLoader.cs +++ b/CadAddinManager/Model/AssemLoader.cs @@ -5,6 +5,7 @@ using System.Windows; using CadAddinManager.View; using Mono.Cecil; +using Mono.Cecil.Pdb; namespace CadAddinManager.Model; @@ -84,16 +85,18 @@ public Assembly LoadAddinsToTempFolder(string originalFilePath, bool parsingOnly { stringBuilder.Append("-Executing-"); } + tempFolder = FileUtils.CreateTempFolder(stringBuilder.ToString()); - string fileAssemblyTemp = String.Empty; - try - { - fileAssemblyTemp = ResolveDuplicateMethod(originalFilePath); - } - catch (Exception) - { - fileAssemblyTemp = originalFilePath; - } + string fileAssemblyTemp = ResolveDuplicateMethod(originalFilePath); + // string fileAssemblyTemp = String.Empty; + // try + // { + // fileAssemblyTemp = ResolveDuplicateMethod(originalFilePath); + // } + // catch (Exception) + // { + // fileAssemblyTemp = originalFilePath; + // } var assembly = CopyAndLoadAddin(fileAssemblyTemp, parsingOnly); if (assembly == null || !IsAPIReferenced(assembly)) { @@ -104,7 +107,9 @@ public Assembly LoadAddinsToTempFolder(string originalFilePath, bool parsingOnly private string ResolveDuplicateMethod(string originalFilePath) { - AssemblyDefinition ass = AssemblyDefinition.ReadAssembly(originalFilePath); + + // AssemblyDefinition ass = AssemblyDefinition.ReadAssembly(originalFilePath); + AssemblyDefinition ass = GetAssemblyDef(originalFilePath); foreach (ModuleDefinition def in ass.Modules) { foreach (TypeDefinition d in def.Types) @@ -144,7 +149,26 @@ private string ResolveDuplicateMethod(string originalFilePath) ass.Write(fileAssemblyTemp); return fileAssemblyTemp; } + public static AssemblyDefinition GetAssemblyDef(string assemblyPath) + { + + var assemblyResolver = new DefaultAssemblyResolver(); + var assemblyLocation = Path.GetDirectoryName(assemblyPath); + assemblyResolver.AddSearchDirectory(assemblyLocation); + var readerParameters = new ReaderParameters { AssemblyResolver = assemblyResolver }; + + var pdbName = Path.ChangeExtension(assemblyPath, "pdb"); + if (File.Exists(pdbName)) + { + var symbolReaderProvider = new PdbReaderProvider(); + readerParameters.SymbolReaderProvider = symbolReaderProvider; + readerParameters.ReadSymbols = true; + } + + var assemblyDef = AssemblyDefinition.ReadAssembly(assemblyPath, readerParameters); + return assemblyDef; + } private string SaveAssemblyModifyToTemp(string originalFilePath) { string prefix = "RenameCommand-"; diff --git a/CadAddinManager/ViewModel/AddinManager.cs b/CadAddinManager/ViewModel/AddinManager.cs index c5df6b3..8101e4e 100644 --- a/CadAddinManager/ViewModel/AddinManager.cs +++ b/CadAddinManager/ViewModel/AddinManager.cs @@ -1,5 +1,6 @@ using System.Diagnostics; using System.IO; +using System.Reflection; using System.Windows; using CadAddinManager.Model; using Application = Autodesk.AutoCAD.ApplicationServices.Core.Application; @@ -66,7 +67,7 @@ public AddinType LoadAddin(string filePath, AssemLoader assemLoader) { assemLoader.HookAssemblyResolve(); - var assembly = assemLoader.LoadAddinsToTempFolder(filePath, true); + Assembly assembly = assemLoader.LoadAddinsToTempFolder(filePath, true); list = commands.LoadItems(assembly, filePath, AddinType.Command); } catch (Exception e)