mirror of
https://github.com/ShrlAlgo/AddinManager.git
synced 2026-03-08 08:58:53 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
681681c7ed |
@@ -36,41 +36,87 @@ namespace AddInManager
|
||||
|
||||
private Result RunActiveCommand(ExternalCommandData data, ref string message, ElementSet elements)
|
||||
{
|
||||
// 防御性检查:确保 ActiveCmd 不为空
|
||||
if (this.ActiveCmd == null)
|
||||
{
|
||||
MessageBox.Show("错误:ActiveCmd 为 null");
|
||||
return Result.Failed;
|
||||
}
|
||||
|
||||
// 防御性检查:确保 ActiveCmdItem 不为空
|
||||
if (this.ActiveCmdItem == null)
|
||||
{
|
||||
MessageBox.Show("错误:ActiveCmdItem 为 null");
|
||||
return Result.Failed;
|
||||
}
|
||||
|
||||
var filePath = ActiveCmd.FilePath;
|
||||
|
||||
// 检查文件是否存在
|
||||
if (!System.IO.File.Exists(filePath))
|
||||
{
|
||||
MessageBox.Show($"错误:找不到文件 {filePath}");
|
||||
return Result.Failed;
|
||||
}
|
||||
|
||||
var assemLoader = new AssemLoader();
|
||||
Result result;
|
||||
Result result = Result.Failed; // 默认失败
|
||||
|
||||
try
|
||||
{
|
||||
assemLoader.HookAssemblyResolve();
|
||||
|
||||
var assembly = assemLoader.LoadAddinsToTempFolder(filePath, false);
|
||||
if (null == assembly)
|
||||
|
||||
if (assembly == null)
|
||||
{
|
||||
message = "Assembly 加载失败,返回了 null";
|
||||
result = Result.Failed;
|
||||
}
|
||||
else
|
||||
{
|
||||
ActiveTempFolder = assemLoader.TempFolder;
|
||||
var externalCommand = assembly.CreateInstance(ActiveCmdItem.FullClassName) as IExternalCommand;
|
||||
if (externalCommand == null)
|
||||
|
||||
string className = ActiveCmdItem.FullClassName;
|
||||
if (string.IsNullOrEmpty(className)) throw new Exception("类名为空");
|
||||
|
||||
var instanceObj = assembly.CreateInstance(className);
|
||||
|
||||
if (instanceObj == null)
|
||||
{
|
||||
message = $"无法创建实例: {className}。请检查类名是否正确或是否有无参构造函数。";
|
||||
result = Result.Failed;
|
||||
}
|
||||
else
|
||||
{
|
||||
ActiveEC = externalCommand;
|
||||
result = ActiveEC.Execute(data, ref message, elements);
|
||||
var externalCommand = instanceObj as IExternalCommand;
|
||||
if (externalCommand == null)
|
||||
{
|
||||
message = $"{className} 没有实现 IExternalCommand 接口";
|
||||
result = Result.Failed;
|
||||
}
|
||||
else
|
||||
{
|
||||
ActiveEC = externalCommand;
|
||||
result = ActiveEC.Execute(data, ref message, elements);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.ToString());
|
||||
MessageBox.Show($"执行异常:\n{ex.Message}\n\n堆栈:\n{ex.StackTrace}");
|
||||
result = Result.Failed;
|
||||
}
|
||||
finally
|
||||
{
|
||||
assemLoader.UnhookAssemblyResolve();
|
||||
assemLoader.CopyGeneratedFilesBack();
|
||||
// 确保清理工作安全执行
|
||||
try
|
||||
{
|
||||
assemLoader.UnhookAssemblyResolve();
|
||||
assemLoader.CopyGeneratedFilesBack();
|
||||
}
|
||||
catch { /* 忽略清理时的错误,防止掩盖主异常 */ }
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
; 定义应用程序的名称
|
||||
#define MyAppName "RevitAddinManager"
|
||||
; 定义应用程序的版本号
|
||||
#define MyAppVersion "1.0.0.0"
|
||||
#define MyAppVersion "2.0.0"
|
||||
; 定义应用程序的发布者
|
||||
#define MyAppPublisher "ShrlAlgo"
|
||||
; 定义应用程序的网址
|
||||
|
||||
Reference in New Issue
Block a user