获取值不能为空。参数名称:发布时的源代码,但不在调试中

Getting Value cannot be null. parameter name: source on release but not in debug

我正在创建一个 Revit 插件,用于将模型信息读取和写入数据库,它在调试模式下一切正常,但是当我发布项目和 运行 Revit 外部插件时 visual studio, 当插件尝试从数据库读取数据时出现错误。

DocumenetOpened 事件中的代码 运行 如下所示:

 public void application_DocumentOpenedEvent(object sender, DocumentOpenedEventArgs e)
    {
        UIApplication uiapp = new UIApplication(sender as Autodesk.Revit.ApplicationServices.Application);
        Document doc = uiapp.ActiveUIDocument.Document;



        //ModelGUID COMMAND
        var command = new ModelCheckerCommandExec();
        command.Execute(uiapp);

    }

然后在下一行失败:

ModelsList = (DatabaseHelper.ReadNonAsync<RevitModel>())
.Where(m => m.ModelGUID == DataStores.ModelData.ModelGUID).ToList();

在这个被执行的代码块中:

public class ModelCheckerCommandExec : IExternalCommand
{
    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
        return Execute(commandData.Application);
    }

    public Result Execute(UIApplication uiapp)
    {
        Document doc = uiapp.ActiveUIDocument.Document;

        Transaction trans = new Transaction(doc);
        try
        {
            trans.Start("ModelGUID");
            ModelGUIDCommand.GetAndSetGUID(doc);
            trans.Commit();

            var ModelsList = new List<RevitModel>();
            ModelsList = (DatabaseHelper.ReadNonAsync<RevitModel>()).ToList();//.Where(m => m.ModelGUID == DataStores.ModelData.ModelGUID).ToList(); // Read method only finds models the are similar to the DataStore.ModelDate.DBId;

            if (ModelsList.Count == 1)
            {

                trans.Start("DataFromDB");

                doc.ProjectInformation.Name = ModelsList[0].ProjectName;
                doc.ProjectInformation.Number = ModelsList[0].ModelNumber;
                doc.ProjectInformation.Status = ModelsList[0].ModelStatus;
                doc.ProjectInformation.IssueDate = ModelsList[0].ProjectIssueDate;
                doc.ProjectInformation.ClientName = ModelsList[0].ClientName;
                doc.ProjectInformation.Address = ModelsList[0].ProjectAddress;
                doc.ProjectInformation.LookupParameter("Cadastral Data").Set(ModelsList[0].ProjectIssueDate);
                doc.ProjectInformation.LookupParameter("Current Version").Set(ModelsList[0].CurrentVersion);
                doc.ProjectInformation.BuildingName = ModelsList[0].BuildingName;

                DataStores.ModelData.ModelManager1 = ModelsList[0].ModelManagerOne;
                DataStores.ModelData.ModelManager1Id = ModelsList[0].ModelManagerOneId;
                DataStores.ModelData.ModelManager2 = ModelsList[0].ModelManagerTwo;
                DataStores.ModelData.ModelManager2Id = ModelsList[0].ModelManagerTwoId;


                trans.Commit();
            }

            return Result.Succeeded;
        }
        catch (Exception ex)
        {
            TaskDialog.Show("Error", ex.Message);
            return Result.Failed;
        }
    }
}

“ReadNonAsync”方法如下:

public static List<T> ReadNonAsync<T>() where T : IHasId
        {

            using (var client = new HttpClient())
            {
                var result = client.GetAsync($"{dbPath}{Properties.Settings.Default.CompanyName}_{typeof(T).Name.ToLower()}.json?access_token={DataStores.IdToken.UserIdToken}").GetAwaiter().GetResult();
                var jsonResult = result.Content.ReadAsStringAsync().GetAwaiter().GetResult();

                if (result.IsSuccessStatusCode)
                {
                    var objects = JsonConvert.DeserializeObject<Dictionary<string, T>>(jsonResult);
                    List<T> list = new List<T>();

                    if (objects != null)
                    {
                        foreach (var o in objects)
                        {
                            o.Value.Id = o.Key;
                            list.Add(o.Value);
                        }
                    }

                    return list;
                }
                else
                {
                    return null;
                }
            }
        }

在我的其余代码中,我使用了一个可行的异步读取方法,所以我想知道这是否是问题所在,但 Revit 不允许我在执行方法中使用异步方法。

我该如何正确调试这个问题,为什么在调试中可以运行的代码在“实时”版本中不起作用?

我找到了解决办法!

问题: 错误的原因是当我 运行 软件处于调试模式时,“xxx.txt” 的文件路径在解决方案文件夹中找到文件,但是当我 运行 软件“ xxx.txt" 指向软件的文件夹而不是 .dll - 所以在我的例子中它指向“c:\Program Files\Autodesk\Revit21”.

修复: 对路径进行硬编码,或者通过获取正在执行的 .dll

的路径
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)

Debugging/Troubleshooting: 我通过在所有 try/catch 语句中插入带有错误消息的对话框来发现问题。