diff --git a/AddInManager.sln b/AddInManager.sln
index e55e977..eb3f9ea 100644
--- a/AddInManager.sln
+++ b/AddInManager.sln
@@ -1,20 +1,26 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.0.31903.59
+# Visual Studio Version 18
+VisualStudioVersion = 18.1.11312.151 d18.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddInManager", "AddInManager\AddInManager.csproj", "{1A000607-4238-4AB2-9E73-A6937E061ABE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1A000607-4238-4AB2-9E73-A6937E061ABE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1A000607-4238-4AB2-9E73-A6937E061ABE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1A000607-4238-4AB2-9E73-A6937E061ABE}.Debug|x64.ActiveCfg = Debug|x64
+ {1A000607-4238-4AB2-9E73-A6937E061ABE}.Debug|x64.Build.0 = Debug|x64
{1A000607-4238-4AB2-9E73-A6937E061ABE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1A000607-4238-4AB2-9E73-A6937E061ABE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1A000607-4238-4AB2-9E73-A6937E061ABE}.Release|x64.ActiveCfg = Release|x64
+ {1A000607-4238-4AB2-9E73-A6937E061ABE}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/AddInManager/AIM.cs b/AddInManager/AIM.cs
index 63fbe47..c611ca3 100644
--- a/AddInManager/AIM.cs
+++ b/AddInManager/AIM.cs
@@ -1,5 +1,4 @@
using System;
-using System.Reflection;
using System.Windows;
using Autodesk.Revit.DB;
diff --git a/AddInManager/AddInManager.csproj b/AddInManager/AddInManager.csproj
index 213e96a..48b23f6 100644
--- a/AddInManager/AddInManager.csproj
+++ b/AddInManager/AddInManager.csproj
@@ -9,8 +9,10 @@
False
False
net48
+ AnyCPU;x64
+
diff --git a/AddInManager/Addin.cs b/AddInManager/Addin.cs
index b50b3df..d274c55 100644
--- a/AddInManager/Addin.cs
+++ b/AddInManager/Addin.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.IO;
namespace AddInManager
diff --git a/AddInManager/AddinItem.cs b/AddInManager/AddinItem.cs
index f4d324b..7149e35 100644
--- a/AddInManager/AddinItem.cs
+++ b/AddInManager/AddinItem.cs
@@ -10,12 +10,12 @@ namespace AddInManager
public AddinItem(AddinType type)
{
AddinType = type;
- m_clientId = Guid.NewGuid();
- ClientIdString = m_clientId.ToString();
- m_assemblyPath = string.Empty;
+ MClientId = Guid.NewGuid();
+ ClientIdString = MClientId.ToString();
+ MAssemblyPath = string.Empty;
AssemblyName = string.Empty;
FullClassName = string.Empty;
- m_name = string.Empty;
+ _mName = string.Empty;
Save = true;
VisibilityMode = VisibilityMode.AlwaysVisible;
}
@@ -26,20 +26,20 @@ namespace AddInManager
RegenerationMode = regenerationOption;
JournalingMode = journalingMode;
AddinType = type;
- m_assemblyPath = assemblyPath;
- AssemblyName = Path.GetFileName(m_assemblyPath);
- m_clientId = clientId;
+ MAssemblyPath = assemblyPath;
+ AssemblyName = Path.GetFileName(MAssemblyPath);
+ MClientId = clientId;
ClientIdString = clientId.ToString();
FullClassName = fullClassName;
var num = fullClassName.LastIndexOf(".");
- m_name = fullClassName.Substring(num + 1);
+ _mName = fullClassName.Substring(num + 1);
Save = true;
VisibilityMode = VisibilityMode.AlwaysVisible;
}
public void SaveToManifest()
{
- var manifestFile = new ManifestFile($"{m_name}.addin");
+ var manifestFile = new ManifestFile($"{_mName}.addin");
if (AddinType == AddinType.Application)
{
manifestFile.Applications.Add(this);
@@ -55,11 +55,11 @@ namespace AddInManager
public string AssemblyPath
{
- get => m_assemblyPath;
+ get => MAssemblyPath;
set
{
- m_assemblyPath = value;
- AssemblyName = Path.GetFileName(m_assemblyPath);
+ MAssemblyPath = value;
+ AssemblyName = Path.GetFileName(MAssemblyPath);
}
}
@@ -67,11 +67,11 @@ namespace AddInManager
public Guid ClientId
{
- get => m_clientId;
+ get => MClientId;
set
{
- m_clientId = value;
- ClientIdString = m_clientId.ToString();
+ MClientId = value;
+ ClientIdString = MClientId.ToString();
}
}
@@ -81,43 +81,29 @@ namespace AddInManager
public string Name
{
- get
- {
- if (string.IsNullOrEmpty(m_name))
- {
- return "External Tool";
- }
- return m_name;
- }
+ get => string.IsNullOrEmpty(_mName) ? "External Tool" : _mName;
set
{
if (!string.IsNullOrEmpty(value))
{
- m_name = value;
+ _mName = value;
return;
}
- m_name = "External Tool";
+ _mName = "External Tool";
}
}
public string Description
{
- get
- {
- if (string.IsNullOrEmpty(m_description))
- {
- return "\"\"";
- }
- return m_description;
- }
+ get => string.IsNullOrEmpty(field) ? "\"\"" : field;
set
{
if (string.IsNullOrEmpty(value))
{
- m_description = "\"\"";
+ field = "\"\"";
return;
}
- m_description = value;
+ field = value;
}
}
@@ -135,12 +121,11 @@ namespace AddInManager
public override string ToString()
{
- return m_name;
+ return _mName;
}
- protected string m_assemblyPath;
- protected Guid m_clientId;
- private string m_name;
- private string m_description;
+ protected string MAssemblyPath;
+ protected Guid MClientId;
+ private string _mName;
}
}
diff --git a/AddInManager/AddinManager.cs b/AddInManager/AddinManager.cs
index 7c1cc7a..6b63af3 100644
--- a/AddInManager/AddinManager.cs
+++ b/AddInManager/AddinManager.cs
@@ -4,7 +4,8 @@ using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
-
+using System.Runtime.Serialization.Json;
+using System.Text;
using AddInManager.Properties;
namespace AddInManager
@@ -33,10 +34,46 @@ namespace AddInManager
private void GetIniFilePaths()
{
- var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
+ //var folderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
+ var folderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var appFolder = Path.Combine(folderPath, Resources.AppFolder);
- var iniFilePath = Path.Combine(appFolder, "AimInternal.ini");
+ // switch from INI to JSON storage
+ var iniFilePath = Path.Combine(appFolder, "AimInternal.json");
AimIniFile = new IniFile(iniFilePath);
+
+ // If an old INI exists, migrate it to JSON (one-time)
+ try
+ {
+ var oldIniPath = Path.Combine(appFolder, "AimInternal.ini");
+ if (File.Exists(oldIniPath) && !File.Exists(iniFilePath))
+ {
+ var oldIni = new IniFile(oldIniPath);
+ // populate commands/applications from old INI
+ Commands.ReadItems(oldIni);
+ Applications.ReadItems(oldIni);
+
+ // save to new JSON store
+ SaveToPersistentStore(iniFilePath);
+
+ // backup old INI
+ try
+ {
+ var backupPath = oldIniPath + ".bak";
+ File.Copy(oldIniPath, backupPath, true);
+ FileUtils.SetWriteable(oldIniPath);
+ File.Delete(oldIniPath);
+ }
+ catch (Exception)
+ {
+ // ignore backup errors
+ }
+ }
+ }
+ catch (Exception)
+ {
+ // ignore migration errors
+ }
+
var currentProcess = Process.GetCurrentProcess();
var fileName = currentProcess.MainModule.FileName;
var revitIniFilePath = fileName.Replace(".exe", ".ini");
@@ -45,8 +82,12 @@ namespace AddInManager
public void ReadAddinsFromAimIni()
{
- Commands.ReadItems(AimIniFile);
- Applications.ReadItems(AimIniFile);
+ // try load from persistent JSON store; if fails, fall back to legacy INI-format reader
+ if (!LoadFromPersistentStore(AimIniFile.FilePath))
+ {
+ Commands.ReadItems(AimIniFile);
+ Applications.ReadItems(AimIniFile);
+ }
}
public void RemoveAddin(Addin addin)
@@ -101,49 +142,34 @@ namespace AddInManager
return addinType;
}
- public void SaveToRevitIni()
- {
- if (!File.Exists(RevitIniFile.FilePath))
- {
- throw new System.IO.FileNotFoundException($"路径{RevitIniFile.FilePath}中未找到revit.ini: ",
- RevitIniFile.FilePath
-);
- }
- Commands.Save(RevitIniFile);
- Applications.Save(RevitIniFile);
- }
-
public void SaveToLocal(AddinType addinTypeToSave)
{
SaveToLocalManifest(addinTypeToSave);
}
- public void SaveToLocalRevitIni()
- {
- foreach (var keyValuePair in Commands.AddinDict)
- {
- var key = keyValuePair.Key;
- var value = keyValuePair.Value;
- var directoryName = Path.GetDirectoryName(value.FilePath);
- var iniFile = new IniFile(Path.Combine(directoryName, "revit.ini"));
- value.SaveToLocalIni(iniFile);
- if (Applications.AddinDict.ContainsKey(key))
- {
- var addin = Applications.AddinDict[key];
- addin.SaveToLocalIni(iniFile);
- }
- }
- }
-
public void SaveToAimIni()
{
- if (!File.Exists(AimIniFile.FilePath))
+ // ensure file exists
+ try
{
- new FileInfo(AimIniFile.FilePath).Create();
- FileUtils.SetWriteable(AimIniFile.FilePath);
+ if (!File.Exists(AimIniFile.FilePath))
+ {
+ new FileInfo(AimIniFile.FilePath).Directory?.Create();
+ FileUtils.CreateFile(AimIniFile.FilePath);
+ FileUtils.SetWriteable(AimIniFile.FilePath);
+ }
+ }
+ catch (Exception)
+ {
+ // ignore
+ }
+
+ // save to persistent JSON store; if fails, fall back to legacy INI writer
+ if (!SaveToPersistentStore(AimIniFile.FilePath))
+ {
+ Commands.Save(AimIniFile);
+ Applications.Save(AimIniFile);
}
- Commands.Save(AimIniFile);
- Applications.Save(AimIniFile);
}
public bool HasItemsToSave()
@@ -222,7 +248,7 @@ namespace AddInManager
}
else
{
- addinFilePath = GetProperFilePath(currentAddinFolder, "ExternalTool", ".addin");
+ addinFilePath = GetProperFilePath(currentAddinFolder, addinFileName, ".addin");
}
manifestFile.SaveAs(addinFilePath);
return addinFilePath;
@@ -278,5 +304,168 @@ namespace AddInManager
while (File.Exists(filePath));
return filePath;
}
+
+ private bool LoadFromPersistentStore(string filePath)
+ {
+ try
+ {
+ if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath)) return false;
+ using (var fs = File.OpenRead(filePath))
+ {
+ var ser = new DataContractJsonSerializer(typeof(PersistentAddinStore));
+ var obj = ser.ReadObject(fs) as PersistentAddinStore;
+ if (obj == null) return false;
+
+
+ // reset internal dictionaries
+ Commands.AddinDict.Clear();
+ Applications.AddinDict.Clear();
+
+ foreach (var p in obj.Commands)
+ {
+ var items = new List();
+ foreach (var pi in p.Items)
+ {
+ var ai = new AddinItem(pi.AssemblyPath ?? string.Empty, pi.ClientId == Guid.Empty ? Guid.NewGuid() : pi.ClientId, pi.FullClassName ?? string.Empty, AddinType.Command, pi.TransactionMode, pi.RegenerationMode, pi.JournalingMode)
+ {
+ Name = pi.Name,
+ Description = pi.Description,
+ VisibilityMode = pi.VisibilityMode,
+ Save = pi.Save,
+ Hidden = pi.Hidden
+ };
+ items.Add(ai);
+ }
+ var addin = new Addin(p.FilePath ?? string.Empty, items)
+ {
+ Save = p.Save,
+ Hidden = p.Hidden
+ };
+ Commands.AddAddIn(addin);
+ }
+
+ foreach (var p in obj.Applications)
+ {
+ var items = new List();
+ foreach (var pi in p.Items)
+ {
+ var ai = new AddinItem(pi.AssemblyPath ?? string.Empty, pi.ClientId == Guid.Empty ? Guid.NewGuid() : pi.ClientId, pi.FullClassName ?? string.Empty, AddinType.Application, pi.TransactionMode, pi.RegenerationMode, pi.JournalingMode)
+ {
+ Name = pi.Name,
+ Description = pi.Description,
+ VisibilityMode = pi.VisibilityMode,
+ Save = pi.Save,
+ Hidden = pi.Hidden
+ };
+ items.Add(ai);
+ }
+ var addin = new Addin(p.FilePath ?? string.Empty, items)
+ {
+ Save = p.Save,
+ Hidden = p.Hidden
+ };
+ Applications.AddAddIn(addin);
+ }
+
+ return true;
+ }
+ }
+ catch (Exception)
+ {
+ return false;
+ }
+ }
+
+ private bool SaveToPersistentStore(string filePath)
+ {
+ try
+ {
+ var store = new PersistentAddinStore
+ {
+ FormatVersion = 1,
+ RevitVersion = App.RevitVersion,
+ LastSaved = DateTime.Now
+ };
+
+ foreach (var kv in Commands.AddinDict)
+ {
+ var a = kv.Value;
+ var p = new PersistentAddin
+ {
+ FilePath = a.FilePath,
+ Save = a.Save,
+ Hidden = a.Hidden
+ };
+ foreach (var ai in a.ItemList)
+ {
+ var pi = new PersistentAddinItem
+ {
+ AddinType = ai.AddinType,
+ AssemblyPath = ai.AssemblyPath,
+ AssemblyName = ai.AssemblyName,
+ ClientId = ai.ClientId,
+ FullClassName = ai.FullClassName,
+ Name = ai.Name,
+ Description = ai.Description,
+ VisibilityMode = ai.VisibilityMode,
+ Save = ai.Save,
+ Hidden = ai.Hidden,
+ TransactionMode = ai.TransactionMode,
+ RegenerationMode = ai.RegenerationMode,
+ JournalingMode = ai.JournalingMode
+ };
+ p.Items.Add(pi);
+ }
+ store.Commands.Add(p);
+ }
+
+ foreach (var kv in Applications.AddinDict)
+ {
+ var a = kv.Value;
+ var p = new PersistentAddin
+ {
+ FilePath = a.FilePath,
+ Save = a.Save,
+ Hidden = a.Hidden
+ };
+ foreach (var ai in a.ItemList)
+ {
+ var pi = new PersistentAddinItem
+ {
+ AddinType = ai.AddinType,
+ AssemblyPath = ai.AssemblyPath,
+ AssemblyName = ai.AssemblyName,
+ ClientId = ai.ClientId,
+ FullClassName = ai.FullClassName,
+ Name = ai.Name,
+ Description = ai.Description,
+ VisibilityMode = ai.VisibilityMode,
+ Save = ai.Save,
+ Hidden = ai.Hidden,
+ TransactionMode = ai.TransactionMode,
+ RegenerationMode = ai.RegenerationMode,
+ JournalingMode = ai.JournalingMode
+ };
+ p.Items.Add(pi);
+ }
+ store.Applications.Add(p);
+ }
+
+ var directory = Path.GetDirectoryName(filePath);
+ if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) Directory.CreateDirectory(directory);
+
+ using (var fs = File.Open(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
+ {
+ var ser = new DataContractJsonSerializer(typeof(PersistentAddinStore));
+ ser.WriteObject(fs, store);
+ }
+
+ return true;
+ }
+ catch (Exception)
+ {
+ return false;
+ }
+ }
}
}
diff --git a/AddInManager/AddinsApplication.cs b/AddInManager/AddinsApplication.cs
index cf31e0d..e17b324 100644
--- a/AddInManager/AddinsApplication.cs
+++ b/AddInManager/AddinsApplication.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace AddInManager
+namespace AddInManager
{
public class AddinsApplication : Addins
{
diff --git a/AddInManager/AddinsCommand.cs b/AddInManager/AddinsCommand.cs
index e7217d8..f7f59f1 100644
--- a/AddInManager/AddinsCommand.cs
+++ b/AddInManager/AddinsCommand.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace AddInManager
+namespace AddInManager
{
public class AddinsCommand : Addins
{
diff --git a/AddInManager/App.cs b/AddInManager/App.cs
index 9f9fc2d..e2865c9 100644
--- a/AddInManager/App.cs
+++ b/AddInManager/App.cs
@@ -5,19 +5,10 @@ using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
-using System.Linq;
using System.Reflection;
-using System.Reflection.Emit;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows;
-using System.Windows.Media;
using System.Windows.Media.Imaging;
using AddInManager.Properties;
-
-using Autodesk.Private.InfoCenter;
-using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Windows;
@@ -58,12 +49,10 @@ namespace AddInManager
AddPushButton(pulldownButton, typeof(CAddInManagerFaceless), "插件管理(手动模式,无界面)");
AddPushButton(pulldownButton, typeof(CAddInManagerReadOnly), "插件管理(只读模式)");
var tab = ComponentManager.Ribbon.FindTab("Modify");
- if (tab != null)
- {
- var adwPanel = new Autodesk.Windows.RibbonPanel();
- adwPanel.CopyFrom(GetRibbonPanel(ribbonPanel));
- tab.Panels.Add(adwPanel);
- }
+ if (tab == null) return;
+ var adwPanel = new Autodesk.Windows.RibbonPanel();
+ adwPanel.CopyFrom(GetRibbonPanel(ribbonPanel));
+ tab.Panels.Add(adwPanel);
}
internal static BitmapImage ToImageSource(Bitmap bitmap)
diff --git a/AddInManager/CAddInManagerFaceless.cs b/AddInManager/CAddInManagerFaceless.cs
index d2ec081..91f9964 100644
--- a/AddInManager/CAddInManagerFaceless.cs
+++ b/AddInManager/CAddInManagerFaceless.cs
@@ -4,8 +4,6 @@ using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
-using System;
-
namespace AddInManager
{
[Transaction(TransactionMode.Manual)]
diff --git a/AddInManager/FailedToRunECDialog.cs b/AddInManager/FailedToRunECDialog.cs
index adb373b..aa1aa51 100644
--- a/AddInManager/FailedToRunECDialog.cs
+++ b/AddInManager/FailedToRunECDialog.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Windows;
+using System.Windows;
using AddInManager.Properties;
diff --git a/AddInManager/FileUtils.cs b/AddInManager/FileUtils.cs
index 14f8b16..d4e23bc 100644
--- a/AddInManager/FileUtils.cs
+++ b/AddInManager/FileUtils.cs
@@ -30,7 +30,7 @@ namespace AddInManager
{
}
}
- var text = string.Format("{0:yyyyMMdd_HHmmss_ffff}", DateTime.Now);
+ var text = $"{DateTime.Now:yyyyMMdd_HHmmss_ffff}";
var text2 = Path.Combine(directoryInfo.FullName, prefix + text);
var directoryInfo3 = new DirectoryInfo(text2);
directoryInfo3.Create();
@@ -48,7 +48,7 @@ namespace AddInManager
public static bool SameFile(string file1, string file2)
{
- return 0 == string.Compare(file1.Trim(), file2.Trim(), true);
+ return 0 == string.Compare(file1.Trim(), file2.Trim(), StringComparison.OrdinalIgnoreCase);
}
public static bool CreateFile(string filePath)
@@ -213,6 +213,7 @@ namespace AddInManager
}
catch (Exception)
{
+ // ignored
}
}
@@ -233,7 +234,5 @@ namespace AddInManager
}
return num / 1024L / 1024L;
}
-
- private const string TempFolderName = "RevitAddins";
}
}
diff --git a/AddInManager/FolderTooBigDialog.cs b/AddInManager/FolderTooBigDialog.cs
index c127490..7f4a791 100644
--- a/AddInManager/FolderTooBigDialog.cs
+++ b/AddInManager/FolderTooBigDialog.cs
@@ -1,6 +1,4 @@
using AddInManager.Properties;
-
-using System;
using System.Text;
using System.Windows;
diff --git a/AddInManager/IAddinNode.cs b/AddInManager/IAddinNode.cs
index f05171d..cf9f95e 100644
--- a/AddInManager/IAddinNode.cs
+++ b/AddInManager/IAddinNode.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace AddInManager
+namespace AddInManager
{
public interface IAddinNode
{
diff --git a/AddInManager/IniFile.cs b/AddInManager/IniFile.cs
index 1fc7866..59a6f8f 100644
--- a/AddInManager/IniFile.cs
+++ b/AddInManager/IniFile.cs
@@ -1,7 +1,10 @@
-using System;
-using System.IO;
+using System.IO;
using System.Runtime.InteropServices;
using System.Text;
+using System;
+using System.Collections.Generic;
+using System.Runtime.Serialization.Json;
+using System.Runtime.Serialization;
namespace AddInManager
{
@@ -9,28 +12,78 @@ namespace AddInManager
{
public string FilePath { get; }
+ private readonly bool m_isJson;
+ private Dictionary> m_jsonData;
+
public IniFile(string filePath)
{
FilePath = filePath;
+ m_isJson = string.Equals(Path.GetExtension(FilePath), ".json", StringComparison.OrdinalIgnoreCase);
if (!File.Exists(FilePath))
{
FileUtils.CreateFile(FilePath);
FileUtils.SetWriteable(FilePath);
+ if (m_isJson)
+ {
+ m_jsonData = new Dictionary>(StringComparer.Ordinal);
+ SaveJson();
+ }
+ }
+
+ if (m_isJson)
+ {
+ LoadJson();
}
}
public void WriteSection(string iniSection)
{
+ if (m_isJson)
+ {
+ if (m_jsonData == null)
+ {
+ m_jsonData = new Dictionary>(StringComparer.Ordinal);
+ }
+ m_jsonData[iniSection] = new Dictionary(StringComparer.Ordinal);
+ SaveJson();
+ return;
+ }
WritePrivateProfileSection(iniSection, null, FilePath);
}
public void Write(string iniSection, string iniKey, object iniValue)
{
+ if (m_isJson)
+ {
+ if (m_jsonData == null)
+ {
+ m_jsonData = new Dictionary>(StringComparer.Ordinal);
+ }
+ if (!m_jsonData.ContainsKey(iniSection))
+ {
+ m_jsonData[iniSection] = new Dictionary(StringComparer.Ordinal);
+ }
+ m_jsonData[iniSection][iniKey] = iniValue?.ToString() ?? string.Empty;
+ SaveJson();
+ return;
+ }
WritePrivateProfileString(iniSection, iniKey, iniValue.ToString(), FilePath);
}
public string ReadString(string iniSection, string iniKey)
{
+ if (m_isJson)
+ {
+ if (m_jsonData != null && m_jsonData.TryGetValue(iniSection, out var section))
+ {
+ if (section != null && section.TryGetValue(iniKey, out var val))
+ {
+ return val;
+ }
+ }
+ return string.Empty;
+ }
+
var stringBuilder = new StringBuilder(255);
GetPrivateProfileString(iniSection, iniKey, string.Empty, stringBuilder, 255, FilePath);
return stringBuilder.ToString();
@@ -38,9 +91,66 @@ namespace AddInManager
public int ReadInt(string iniSection, string iniKey)
{
+ if (m_isJson)
+ {
+ var s = ReadString(iniSection, iniKey);
+ if (int.TryParse(s, out var v)) return v;
+ return 0;
+ }
return GetPrivateProfileInt(iniSection, iniKey, 0, FilePath);
}
+ private void LoadJson()
+ {
+ try
+ {
+ if (!File.Exists(FilePath))
+ {
+ m_jsonData = new Dictionary>(StringComparer.Ordinal);
+ return;
+ }
+ var bytes = File.ReadAllBytes(FilePath);
+ if (bytes == null || bytes.Length == 0)
+ {
+ m_jsonData = new Dictionary>(StringComparer.Ordinal);
+ return;
+ }
+ using (var ms = new MemoryStream(bytes))
+ {
+ var ser = new DataContractJsonSerializer(typeof(Dictionary>));
+ var obj = ser.ReadObject(ms) as Dictionary>;
+ m_jsonData = obj ?? new Dictionary>(StringComparer.Ordinal);
+ }
+ }
+ catch (Exception)
+ {
+ m_jsonData = new Dictionary>(StringComparer.Ordinal);
+ }
+ }
+
+ private void SaveJson()
+ {
+ try
+ {
+ var directory = Path.GetDirectoryName(FilePath);
+ if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
+ {
+ Directory.CreateDirectory(directory);
+ }
+ using (var ms = new MemoryStream())
+ {
+ var ser = new DataContractJsonSerializer(typeof(Dictionary>));
+ ser.WriteObject(ms, m_jsonData ?? new Dictionary>(StringComparer.Ordinal));
+ var data = ms.ToArray();
+ File.WriteAllBytes(FilePath, data);
+ }
+ }
+ catch (Exception)
+ {
+ // ignore
+ }
+ }
+
[DllImport("kernel32.dll")]
private static extern int WritePrivateProfileSection(string lpAppName, string lpString, string lpFileName);
diff --git a/AddInManager/PersistentAddinStore.cs b/AddInManager/PersistentAddinStore.cs
new file mode 100644
index 0000000..a4aaecb
--- /dev/null
+++ b/AddInManager/PersistentAddinStore.cs
@@ -0,0 +1,85 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+using Autodesk.Revit.Attributes;
+
+namespace AddInManager
+{
+ [DataContract]
+ public class PersistentAddinStore
+ {
+ [DataMember]
+ public int FormatVersion { get; set; } = 1;
+
+ [DataMember]
+ public string RevitVersion { get; set; }
+
+ [DataMember]
+ public DateTime LastSaved { get; set; }
+
+ [DataMember]
+ public List Commands { get; set; } = new List();
+
+ [DataMember]
+ public List Applications { get; set; } = new List();
+ }
+
+ [DataContract]
+ public class PersistentAddin
+ {
+ [DataMember]
+ public string FilePath { get; set; }
+
+ [DataMember]
+ public bool Save { get; set; }
+
+ [DataMember]
+ public bool Hidden { get; set; }
+
+ [DataMember]
+ public List Items { get; set; } = new List();
+ }
+
+ [DataContract]
+ public class PersistentAddinItem
+ {
+ [DataMember]
+ public AddinType AddinType { get; set; }
+
+ [DataMember]
+ public string AssemblyPath { get; set; }
+
+ [DataMember]
+ public string AssemblyName { get; set; }
+
+ [DataMember]
+ public Guid ClientId { get; set; }
+
+ [DataMember]
+ public string FullClassName { get; set; }
+
+ [DataMember]
+ public string Name { get; set; }
+
+ [DataMember]
+ public string Description { get; set; }
+
+ [DataMember]
+ public VisibilityMode VisibilityMode { get; set; }
+
+ [DataMember]
+ public bool Save { get; set; }
+
+ [DataMember]
+ public bool Hidden { get; set; }
+
+ [DataMember]
+ public TransactionMode? TransactionMode { get; set; }
+
+ [DataMember]
+ public RegenerationOption? RegenerationMode { get; set; }
+
+ [DataMember]
+ public JournalingMode? JournalingMode { get; set; }
+ }
+}
diff --git a/AddInManager/Properties/Resources.Designer.cs b/AddInManager/Properties/Resources.Designer.cs
index b0bdbd0..ec80be6 100644
--- a/AddInManager/Properties/Resources.Designer.cs
+++ b/AddInManager/Properties/Resources.Designer.cs
@@ -61,7 +61,7 @@ namespace AddInManager.Properties {
}
///
- /// 查找类似 RevitAddInManager 的本地化字符串。
+ /// 查找类似 AddinData 的本地化字符串。
///
internal static string AppFolder {
get {
diff --git a/AddInManager/Properties/Resources.resx b/AddInManager/Properties/Resources.resx
index e24b8f4..9642296 100644
--- a/AddInManager/Properties/Resources.resx
+++ b/AddInManager/Properties/Resources.resx
@@ -118,7 +118,7 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- RevitAddInManager
+ AddinData
插件管理
diff --git a/AddInManager/Wpf/AssemblySelectorWindow.xaml.cs b/AddInManager/Wpf/AssemblySelectorWindow.xaml.cs
index 00d270d..dabafeb 100644
--- a/AddInManager/Wpf/AssemblySelectorWindow.xaml.cs
+++ b/AddInManager/Wpf/AssemblySelectorWindow.xaml.cs
@@ -1,6 +1,4 @@
using Microsoft.Win32;
-
-using System;
using System.IO;
using System.Text;
using System.Windows;
diff --git a/AddInManager/Wpf/MainWindow.xaml.cs b/AddInManager/Wpf/MainWindow.xaml.cs
index 56ff2ab..f926d5d 100644
--- a/AddInManager/Wpf/MainWindow.xaml.cs
+++ b/AddInManager/Wpf/MainWindow.xaml.cs
@@ -1116,7 +1116,7 @@ namespace AddInManager.Wpf
// (重写) 重新加载
private void ContextMenuReload_Click(object sender, RoutedEventArgs e)
{
- if (!(commandsTreeView.SelectedItem is TreeViewItem selectedItem)) return;
+ if (commandsTreeView.SelectedItem is not TreeViewItem selectedItem) return;
Addin addinToReload = null;
// 判断选中项是Addin(父)还是AddinItem(子)
@@ -1130,7 +1130,7 @@ namespace AddInManager.Wpf
var parent = VisualTreeHelper.GetParent(selectedItem);
while (parent != null)
{
- if (parent is TreeViewItem parentItem && parentItem.Tag is Addin parentAddin)
+ if (parent is TreeViewItem { Tag: Addin parentAddin })
{
addinToReload = parentAddin;
break;