我有两个类库coreplugins和使用这两个库的WPF应用程序。在core中,我动态加载plugins,如下所示:

try
        {
            Assembly assembly = Assembly.LoadFile("plugins.dll");
        }


加载plugins.dll后,我从plugins库中获得实现了Node抽象类的core中的类型,该类是core中定义的类。这是我用来开发可扩展应用程序的场景。
在我的core库中的某个地方,我需要遍历从Node加载的plugins类的所有字段。它对intdouble和在plugins库中定义的其他自定义类的所有字段都适用。

theList = assembly.GetTypes().ToList().Where(t => t.BaseType == typeof(Node)).ToList();
var fieldInfos = theList[0].GetType().GetRuntimeFields();
foreach (var item in fieldInfos)
        {
            Type type = item.FieldType;
            // Here I get exception for fields like XYZ that defined in
            // Revit API though for fields like Int and double it works charm
        }


但是问题是,在plugins项目中,我也使用Revit API,并且当上述循环到达RevitAPI.dll的字段时,出现以下异常(我尝试了目标平台Any和x86):

An unhandled exception of type 'System.BadImageFormatException' occurred in mscorlib.dll
Additional information: Could not load file or assembly 'RevitAPI,
Version=2015.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its
dependencies. An attempt was made to load a program with an incorrect format.


当我将所有3个项目的build部分中的目标平台更改为x64时,出现此异常,而是:

An unhandled exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll
Additional information: Could not load file or assembly 'RevitAPI.dll'
or one of its dependencies. The specified module could not be found.

最佳答案

Revit API DLL(RevitAPI.dll和RevitAPIUI.dll)并非旨在加载在外部/独立应用程序(.exe)上。您只能在类库(.dll)上使用它们,并作为插件在Revit内加载。

发生这种情况是因为API DLL实际上是实际实现的薄层。因此,您需要运行Revit才能使用它们(作为插件)。

如果您需要从Revit外部访问Revit数据(例如从外部应用程序或导出到数据库),则可以创建一个插件,在Revit上加载,然后从该插件中公开所需的数据。有一些事件可以帮助您,例如空转事件。

10-07 13:13