我有两个类库core
和plugins
以及一个使用这两个库的WPF应用程序。在core
中,我动态加载plugins
,如下所示:
try
{
Assembly assembly = Assembly.LoadFile("plugins.dll");
}
加载plugins.dll
后,我从plugins
中获取了Node
中已实现core
抽象类的类型,这是core
中定义的类。 1}}。这是我用于开发和扩展应用程序的场景。
在我的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个项目的构建部分中的目标平台更改为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.
答案 0 :(得分:4)
Revit API DLL(RevitAPI.dll和RevitAPIUI.dll)未设计为在外部/独立应用程序(.exe)上加载。您只能在类库(.dll)上使用它们,并在Revit中作为插件加载。
这是因为API DLL实际上是实际实现的薄层。因此,您需要Revit运行才能使用它们(作为插件)。
如果您需要从外部Revit访问Revit数据(例如从外部应用程序或导出到数据库),您可以创建插件,加载Revit,并从该插件中公开您需要的数据。有一些事件可以提供帮助,例如空转事件。
答案 1 :(得分:4)
第一个错误(System.BadImageFormatException
)是因为使用AnyCPU平台编译的应用程序是由Visual Studio在x86模式下运行的。 RevitAPI.dll是一个x64混合模式程序集,因此无法在x86进程中加载。
第二个错误(System.IO.FileNotFoundException
)是因为RevitAPI.dll
无法加载其依赖项。您可以通过将ouput或工作目录设置为Revit(C:\Program Files\Autodesk\Revit Architecture 20xx\
)的安装目录来解决此问题。也许你也可以P / Invoke SetDllDirectory
将这个目录添加到搜索路径。
当然,就像Augusto说的那样,Revit没有运行,因此大多数呼叫都会失败。但您可以使用简单的类,例如XYZ
或UnitUtils
。