【问题标题】:Getting Value cannot be null. parameter name: source on release but not in debug获取值不能为空。参数名称:发布时的源,但不在调试中
【发布时间】:2021-10-18 10:40:54
【问题描述】:

我正在创建一个 Revit 插件,该插件可以将模型信息读取和写入数据库,并且在调试模式下一切正常,但是当我发布项目并使用 Visual Studio 外部的插件运行 Revit 时,出现错误当插件尝试从数据库中读取数据时。

代码在 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;
                }
            }
        }

在我的其余代码中,我使用了一个有效的异步 Read 方法,所以我想知道这是否是问题所在,但 Revit 不允许我在 Execute 方法中使用异步方法。

如何正确调试此问题,为什么调试中的代码在“实时”版本中不起作用?

【问题讨论】:

    标签: c# linq debugging firebase-realtime-database revit-api


    【解决方案1】:

    我找到了解决办法!

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

    解决方法: 硬编码路径,或者通过获取执行.dll的路径

    Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
    

    调试/故障排除: 我通过在所有 try/catch 语句中插入带有错误消息的对话框来发现问题。

    【讨论】:

      猜你喜欢
      • 2020-08-26
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      相关资源
      最近更新 更多