C# 无法加载文件或程序集(BadImageFormatException和FileNotFoundException)
我有两个类库C# 无法加载文件或程序集(BadImageFormatException和FileNotFoundException),c#,dll,reflection,.net-assembly,revit-api,C#,Dll,Reflection,.net Assembly,Revit Api,我有两个类库core和plugins,以及一个使用这两个库的WPF应用程序。在core中,我动态加载插件,如下所示: try { Assembly assembly = Assembly.LoadFile("plugins.dll"); } 加载plugins.dll后,我在plugins中获取已从core库中实现节点抽象类的类型,该类是在core中定义的。这是我用来开发和扩展应用程序的场景。 在我的核心库的某个地方,我需要遍历从插件加载
core
和plugins
,以及一个使用这两个库的WPF应用程序。在core
中,我动态加载插件,如下所示:
try
{
Assembly assembly = Assembly.LoadFile("plugins.dll");
}
加载plugins.dll
后,我在plugins
中获取已从core
库中实现节点
抽象类的类型,该类是在core
中定义的。这是我用来开发和扩展应用程序的场景。
在我的核心
库的某个地方,我需要遍历从插件
加载的节点
类的所有字段。它适用于所有字段,如int
、double
和插件库中定义的其他自定义类
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
}
但问题是,在插件项目中,我也使用Revit API,当上述循环到达来自RevitAPI.dll
的字段时,我得到以下异常(我尝试了目标平台Any和x86):
当我将所有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上加载,然后从该插件公开所需的数据。有些事件可能会有所帮助,例如空闲事件。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 Files\Autodesk\Revit Architecture 20xx\
)来解决此问题。您也可以P/InvokeSetDllDirectory
将此目录添加到搜索路径
当然,正如Augusto所说,Revit没有运行,因此大多数调用都会失败。但是您可以使用简单的类,如XYZ
或UnitUtils
第一个错误(System.BadImageFormatException
)是因为您的应用程序使用AnyCPU平台编译,由Visual Studio以x86模式运行。RevitAPI.dll是x64混合模式程序集,因此无法在x86进程中加载它
第二个错误(System.IO.FileNotFoundException
)是因为RevitAPI.dll
无法加载其依赖项。可以通过将输出或工作目录设置为Revit的安装目录(C:\Program Files\Autodesk\Revit Architecture 20xx\
)来解决此问题。您也可以P/InvokeSetDllDirectory
将此目录添加到搜索路径
当然,正如Augusto所说,Revit没有运行,因此大多数调用都会失败。但是您可以使用简单的类,如XYZ
或UnitUtils
是否在加载WPF应用程序(.exe)时在Revit上加载DLL?@AugustoGoncalves在我的WPF应用程序中,我使用核心库加载插件.DLL
,动态使用Assembly.LoadFile()
。而plugins.dll
本身引用的RevitAPI.dll
将无法工作。。。您只能在Revit内部使用RevitAPI.dll(作为插件)@AugustoGoncalves谢谢您的评论。Revit开发人员是否故意通过设置安全权限或类似的内容来阻止其他人在其他应用程序中使用dll?RevitAPI.dll实际上只是实际实现的一个薄层,而不是库本身,这就是为什么它不能用于独立应用程序的原因,在我的WPF应用程序中,我使用core
库加载plugins.DLL
,动态使用Assembly.LoadFile()
。而plugins.dll
本身引用的RevitAPI.dll
将无法工作。。。您只能在Revit内部使用RevitAPI.dll(作为插件)@AugustoGoncalves谢谢您的评论。Revit开发人员是否故意通过设置安全权限或类似的内容来阻止其他人在其他应用程序中使用dll?RevitAPI.dll实际上只是实际实现的一个薄层,而不是库本身,这就是为什么它不能在Revit内部为独立应用程序工作的原因
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.