修复NullReferenceException

This commit is contained in:
GG Z
2026-01-16 21:03:48 +08:00
parent 85b4e30e35
commit 681681c7ed
2 changed files with 56 additions and 10 deletions

View File

@@ -36,23 +36,63 @@ 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;
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
{
var externalCommand = instanceObj as IExternalCommand;
if (externalCommand == null)
{
message = $"{className} 没有实现 IExternalCommand 接口";
result = Result.Failed;
}
else
@@ -62,16 +102,22 @@ namespace AddInManager
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
MessageBox.Show($"执行异常:\n{ex.Message}\n\n堆栈:\n{ex.StackTrace}");
result = Result.Failed;
}
finally
{
// 确保清理工作安全执行
try
{
assemLoader.UnhookAssemblyResolve();
assemLoader.CopyGeneratedFilesBack();
}
catch { /* 忽略清理时的错误,防止掩盖主异常 */ }
}
return result;
}

View File

@@ -4,7 +4,7 @@
; 定义应用程序的名称
#define MyAppName "RevitAddinManager"
; 定义应用程序的版本号
#define MyAppVersion "1.0.0.0"
#define MyAppVersion "2.0.0"
; 定义应用程序的发布者
#define MyAppPublisher "ShrlAlgo"
; 定义应用程序的网址