我有两个类库core
和plugins
,以及一个使用这两个库的WPF应用程序。在core
中,我动态加载plugins
,如下所示:
try
{
Assembly assembly = Assembly.LoadFile("plugins.dll");
}
在我加载plugins.dll
之后,我从core
库中获得了实现Node
抽象类的plugins
中的类型,这是在core
中定义的类。这是我用来开发和扩展应用程序的场景。在我的core
库的某个地方,我需要遍历从plugins
加载的Node
类的所有字段。它适用于所有字段,如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个项目的构建部分中的目标平台更改为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上,并从该插件,暴露你需要的数据。有一些事件可以提供帮助,例如空转事件。
第一个错误(System.BadImageFormatException
)是因为您的应用程序使用AnyCPU平台编译,在Visual Studio的x86模式下运行。RevitAPI.dll是一个x64混合模式程序集,因此它不能在x86进程中加载。
第二个错误(System.IO.FileNotFoundException
)是因为RevitAPI.dll
不能加载它的依赖项。您可以通过将输出或工作目录设置为Revit的安装目录(C:Program FilesAutodeskRevit Architecture 20xx
)来解决这个问题。也可以P/Invoke SetDllDirectory
将此目录添加到搜索路径中。
当然,就像奥古斯托说的,Revit没有运行,因此大多数调用将失败。但是您可以使用简单的类,如XYZ
或UnitUtils
。