"Failed to initialize the [add-in name] because the assembly [path to an add-in DLL file] does not exist" 启动 Revit 时

"Failed to initialize the [add-in name] because the assembly [path to an add-in DLL file] does not exist" when launching Revit

我用尽了所有可能的资源,但无法弄清楚问题出在哪里。当我尝试使用该命令时,按钮图像不会显示并不断收到此消息。

Failed to initialize the [add-in name] because the assembly [path to an add-in DLL file] does not exist

启动 Revit 时。这是我正在使用的代码。

   #region Namespaces
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.CSharp;
using System.Media;
using System.Reflection;
using System.IO.Packaging;
using System.Windows.Media.Imaging;
using System.Drawing.Imaging;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.DB.Architecture;
#endregion

namespace TpMechanical
{
    internal class App : IExternalApplication
    {
        public Result OnStartup(UIControlledApplication a)
        {
            String tabname = "TpMechanical";
            String panelname = "Tools";

            //Option 1

            BitmapImage b1Image = (System.Windows.Media.Imaging.BitmapImage)TpMechanical.Properties.Resources.ResourceManager.GetObject("_design3_fhY_icon.ico");
            BitmapImage b2Image = (System.Windows.Media.Imaging.BitmapImage)TpMechanical.Properties.Resources.ResourceManager.GetObject("_design3_fhY_icon.ico");
            BitmapImage b3Image = (System.Windows.Media.Imaging.BitmapImage)TpMechanical.Properties.Resources.ResourceManager.GetObject("_design3_fhY_icon.ico");

            //Option 2 

            //Bitmap b1Image = (System.Drawing.Bitmap)(TpMechanical.Properties.Resources.ResourceManager.GetObject("Icon1.ico"));
            //Bitmap b2Image = (System.Drawing.Bitmap)(TpMechanical.Properties.Resources.ResourceManager.GetObject("Image1.jpg"));
            //Bitmap b3Image = (System.Drawing.Bitmap)(TpMechanical.Properties.Resources.ResourceManager.GetObject("Image2.bmp"));

            //Option 3 

            //BitmapImage b1Image = new BitmapImage(new Uri("pack:application:,,,/TpMechanical/Resources/Icon1.ico"));
            //BitmapImage b2Image = new BitmapImage(new Uri("pack:application:,,,/TpMechanical/Resources/Image1.jpg"));
            //BitmapImage b3Image = new BitmapImage(new Uri("pack:application:,,,/TpMechanical/Resources/Image2.bmp"));



            a.CreateRibbonTab(tabname);
            var Tools = a.CreateRibbonPanel(tabname, panelname);
            var button1 = new PushButtonData("TpButton1", "Button1", Assembly.GetExecutingAssembly().Location, "TpMechanical.command");
            button1.ToolTip = " This is a short description";
            button1.LongDescription = "This is a long description \n " +
                "this is the second line";
            var btn1 = Tools.AddItem(button1);
            button1.Image = b1Image; 

            var button2 = new PushButtonData("TpButton2", "Button2", Assembly.GetExecutingAssembly().Location, "TpMechanical.command2");
            button2.ToolTip = " This is a short description";
            button2.LongDescription = "This is a long description \n " +
                "this is the second line";
            button2.Image = b2Image;
   
            var button3 = new PushButtonData("TpButton3", "Button3", Assembly.GetExecutingAssembly().Location, "TpMechanical.command3");
            button3.ToolTip = " This is a short description";
            button3.LongDescription = "This is a long description \n " +
                "this is the second line";
            button3.Image = b3Image;
            
            Tools.AddStackedItems(button2, button3);
            

            return Result.Succeeded;
        }

        public Result OnShutdown(UIControlledApplication a)
        {
            return Result.Succeeded;

        }

    }
}

下面还有我的清单代码。

 <?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
  <AddIn Type="Command">
    <Text>Command TpMechanical</Text>
    <Description>Some description for TpMechanical</Description>
    <VisibilityMode>AlwaysVisible</VisibilityMode>
    <Assembly>C:\My Revit- Custom Files-Revit 2021\Revit 2021 Repos\TpMechanical\bin\Debug\TpMechanical.dll</Assembly>
    <FullClassName>TpMechanical.Command</FullClassName>
    <ClientId>9EDCBEA6-942A-4D9A-932D-612B5E02DC9C</ClientId>
    <VendorId>com.typepad.thebuildingcoder</VendorId>
    <VendorDescription>The Building Coder, http://thebuildingcoder.typepad.com</VendorDescription>
  </AddIn>
  <AddIn Type="Command">
    <Text>Command TpMechanical</Text>
    <Description>Some description for TpMechanical</Description>
    <VisibilityMode>AlwaysVisible</VisibilityMode>
    <Assembly>C:\My Revit- Custom Files-Revit 2021\Revit 2021 Repos\TpMechanical\bin\Debug\TpMechanical.dll</Assembly>
    <FullClassName>TpMechanical.Command2</FullClassName>
    <ClientId>1A164A1B-8B02-499A-8ADB-94A75557CD66</ClientId>
    <VendorId>com.typepad.thebuildingcoder</VendorId>
    <VendorDescription>The Building Coder, http://thebuildingcoder.typepad.com</VendorDescription>
  </AddIn>
  <AddIn Type="Command">
    <Text>Command TpMechanical</Text>
    <Description>Some description for TpMechanical</Description>
    <VisibilityMode>AlwaysVisible</VisibilityMode>
    <Assembly>C:\My Revit- Custom Files-Revit 2021\Revit 2021 Repos\TpMechanical\bin\Debug\TpMechanical.dll</Assembly>
    <FullClassName>TpMechanical.Command3</FullClassName>
    <ClientId>C5CEC594-E407-40A8-B1B0-163DAA179CDD</ClientId>
    <VendorId>com.typepad.thebuildingcoder</VendorId>
    <VendorDescription>The Building Coder, http://thebuildingcoder.typepad.com</VendorDescription>
  </AddIn>
  <AddIn Type="Application">
    <Name>Application TpMechanical</Name>
    <Assembly>C:\My Revit- Custom Files-Revit 2021\Revit 2021 Repos\TpMechanical\bin\Debug\TpMechanical.dll</Assembly>
    <FullClassName>TpMechanical.App</FullClassName>
    <ClientId>C12635D2-96E2-4DF4-B172-7BD9487F7AE9</ClientId>
    <VendorId>com.typepad.thebuildingcoder</VendorId>
    <VendorDescription>The Building Coder, http://thebuildingcoder.typepad.com</VendorDescription>
  </AddIn>
</RevitAddIns>

enter image description here

我建议您使用最少的 one-liner 外部命令和最少的 one-liner add-in 清单再试一次。

按照以下步骤操作:Revit developers guide add-in registration

确保 Revit 对其 AddIns 文件夹具有读取权限。

看看Hello world walkthrough

不要说你用尽了所有资源。那将花费太长时间,并且可能会超过您的寿命。新资源的添加速度快于您消耗它们的速度,因此任何尝试都注定要失败。

错误信息告诉你问题不在内部实现代码,而在基本注册。

为什么要将 internal 添加到 IExternalApplication 实施中?这不是自相矛盾吗?这是什么意思?

为什么使用 The Building Coder VendorId?那是不正确的。你不是建筑编码员。

您的 Assembly 路径很复杂并且到处都是空格。一般来说,我尽量避免这样复杂的路径和文件夹名称中的所有空格。我也更喜欢正斜杠而不是反斜杠。如果将 DLL 与 add-in 清单放在 AddIns 文件夹中的相同位置,则可以完全省略文件夹名称。

这些天我被类似的问题淹没了。这是另一个类似的,是最近一封电子邮件线程的摘要:

[Q] 我已按照 Augusto Goncalves 的 DevTV 教程深入研究 Revit 平台入门 API。 None 我的命令出现在 Revit UI > 加载项 > 外部命令中。

[A] 您应该阅读的一件事是 Revit API developers guide 的介绍部分。它准确地告诉您如何安装和启动您的 add-in。令人震惊的是,信息不清楚,但在教程中不起作用。谢谢你提出来!

安装 Revit add-in 真的很简单,但是人们 运行 遇到了你描述的困难。

只有两个相关组件:

  • Add-in 清单文件 *.addin
  • .NET class 库程序集 DLL

这些是重要的步骤:

  • DLL 必须实现 IExternalCommand;也就是说,它必须实现 Execute 方法。
  • add-in 清单必须指向 DLL,并且必须放在 Revit Add-Ins 文件夹中以便 Revit 找到并加载它。
  • 如果 DLL 和 add-in 清单都位于 Revit AddIns 文件夹中,则可以省略完整的 DLL 路径;否则必须指定。

真的就这些了。

解释的地方千千万万;他们都说同样的话。

Revit 祝你好运,玩得开心 API :-)

[R] 自昨天以来,我的 add-in 没有出现在 Revit 外部命令中,我一直没有运气。

我已经仔细地正确构建了我的代码。 add-in 清单文件指向我的项目 .dll 文件。我的项目 class 显式实现了 IExternalCommand 接口并启动了 Execute 方法。

我不明白可能是什么问题,不确定它可能是我正在使用的 revit 版本我正在尝试找出所有可能性。

[R2] 我设法调试了我的代码。请忽略之前的消息。

我的清单 add-in 文件的位置已被锁定。我想那是在我设置帐户时完成的。该位置需要访问权限。此路径:

  • C:\ProgramData\Autodesk\Revit\Addins22\

我使用 try and catch exception 来查看问题。

一旦我授予访问权限,add-in 文件现在可见;成功了!

第三次重读您的问题,听起来好像您的 add-in 正在尝试引用 Revit 尝试加载时无法找到的 .NET 程序集 DLL。查看您在源代码 using 语句中引用的命名空间列表,我只看到列出的标准 Autodesk Revit、Microsoft 和 .NET 程序集。因此,它们都应该存在并且可以访问。您是否在代码中的其他地方使用了该列表中不明显的其他内容?您可以使用 fuslogv 之类的工具在加载期间分析您的 add-in 依赖项,如 Exploring Assembly Reference DLL Hell with Fuslogvw.

注释中所建议