我有两个类库core
和plugins
和使用这两个库的WPF应用程序。在core
中,我动态加载plugins
,如下所示:
try
{
Assembly assembly = Assembly.LoadFile("plugins.dll");
}
加载
plugins.dll
后,我从plugins
库中获得实现了Node
抽象类的core
中的类型,该类是core
中定义的类。这是我用来开发可扩展应用程序的场景。在我的
core
库中的某个地方,我需要遍历从Node
加载的plugins
类的所有字段。它对int
,double
和在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上加载,然后从该插件中公开所需的数据。有一些事件可以帮助您,例如空转事件。