无法加载文件或程序集(BadImageFormatException和FileNotFoundException)

时间:2015-09-17 18:56:07

标签: c# dll reflection .net-assembly revit-api

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

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

加载plugins.dll后,我从plugins中获取了Node中已实现core抽象类的类型,这是core中定义的类。 1}}。这是我用于开发和扩展应用程序的场景。 在我的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个项目的构建部分中的目标平台更改为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.

2 个答案:

答案 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没有运行,因此大多数呼叫都会失败。但您可以使用简单的类,例如XYZUnitUtils