mirror of
https://github.com/ShrlAlgo/AddinManager.git
synced 2026-03-08 00:48:56 +00:00
修复NullReferenceException
This commit is contained in:
@@ -36,23 +36,63 @@ namespace AddInManager
|
|||||||
|
|
||||||
private Result RunActiveCommand(ExternalCommandData data, ref string message, ElementSet elements)
|
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;
|
var filePath = ActiveCmd.FilePath;
|
||||||
|
|
||||||
|
// 检查文件是否存在
|
||||||
|
if (!System.IO.File.Exists(filePath))
|
||||||
|
{
|
||||||
|
MessageBox.Show($"错误:找不到文件 {filePath}");
|
||||||
|
return Result.Failed;
|
||||||
|
}
|
||||||
|
|
||||||
var assemLoader = new AssemLoader();
|
var assemLoader = new AssemLoader();
|
||||||
Result result;
|
Result result = Result.Failed; // 默认失败
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
assemLoader.HookAssemblyResolve();
|
assemLoader.HookAssemblyResolve();
|
||||||
|
|
||||||
var assembly = assemLoader.LoadAddinsToTempFolder(filePath, false);
|
var assembly = assemLoader.LoadAddinsToTempFolder(filePath, false);
|
||||||
if (null == assembly)
|
|
||||||
|
if (assembly == null)
|
||||||
{
|
{
|
||||||
|
message = "Assembly 加载失败,返回了 null";
|
||||||
result = Result.Failed;
|
result = Result.Failed;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ActiveTempFolder = assemLoader.TempFolder;
|
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)
|
if (externalCommand == null)
|
||||||
{
|
{
|
||||||
|
message = $"{className} 没有实现 IExternalCommand 接口";
|
||||||
result = Result.Failed;
|
result = Result.Failed;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -62,16 +102,22 @@ namespace AddInManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
MessageBox.Show(ex.ToString());
|
MessageBox.Show($"执行异常:\n{ex.Message}\n\n堆栈:\n{ex.StackTrace}");
|
||||||
result = Result.Failed;
|
result = Result.Failed;
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
|
{
|
||||||
|
// 确保清理工作安全执行
|
||||||
|
try
|
||||||
{
|
{
|
||||||
assemLoader.UnhookAssemblyResolve();
|
assemLoader.UnhookAssemblyResolve();
|
||||||
assemLoader.CopyGeneratedFilesBack();
|
assemLoader.CopyGeneratedFilesBack();
|
||||||
}
|
}
|
||||||
|
catch { /* 忽略清理时的错误,防止掩盖主异常 */ }
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
; 定义应用程序的名称
|
; 定义应用程序的名称
|
||||||
#define MyAppName "RevitAddinManager"
|
#define MyAppName "RevitAddinManager"
|
||||||
; 定义应用程序的版本号
|
; 定义应用程序的版本号
|
||||||
#define MyAppVersion "1.0.0.0"
|
#define MyAppVersion "2.0.0"
|
||||||
; 定义应用程序的发布者
|
; 定义应用程序的发布者
|
||||||
#define MyAppPublisher "ShrlAlgo"
|
#define MyAppPublisher "ShrlAlgo"
|
||||||
; 定义应用程序的网址
|
; 定义应用程序的网址
|
||||||
|
|||||||
Reference in New Issue
Block a user