从Java启动C#WPF会导致FileNotFoundException

本文关键字:FileNotFoundException C#WPF Java 启动 | 更新日期: 2023-09-27 18:21:04

我有一个现有的Java项目,它需要用C#编写的SDK的功能。它应该打开一个WPF窗口,并在关闭时将信息发送回Java。

为了实现这两个世界的基本连接,我创建了一个调用本机函数的Java项目("DotNetCaller")。这些都是在C++/CLI项目("DotNetBridge")中实现的,该项目调用C#项目("DotNetApplication")。

我已经可以在C#中设置Strings from Java,并从C#回调到Java。

但一旦我添加了一个WPF窗口并尝试用启动它

 Application app = new Application();
 app.Run(new DotNetWindow());

在STA线程中,它崩溃。

DotNetApplication找不到mscorlib.resources,在我提供DLL后,PresentationFramework.resources丢失,如果我提供了它,则DotNetApplication.resources也丢失(我无法提供)。

如果我单独调用DotNetApplication或从DotNetBridge调用,则窗口将按预期显示。

有人能告诉妈妈我到底缺了什么吗?

感谢

编辑:

我又看了一遍这个例子,并试图使它适应我的需要。我已将ResolveEventHandler的dll目录设置为"引用的程序集"中的.NET目录

C: ''Program Files(x86)''参考程序集''Microsoft''Framework.NETFramework''v4.0

并在C#中添加了Window。

它也失败了,但在C++部分而不是C#中出现了一个新的异常。调用ResolveHandler时使用了一个空参数,导致mscorelib中出现不可捕获的异常。我添加了一个检查String是否为空,并且这个基本方法现在运行良好。

我仍然不确定我是否有正确的方法,所以请随意贡献。

从Java启动C#WPF会导致FileNotFoundException

您的AppDomain::AssemblyResolve处理程序可能需要根据您自己对想要做什么的理解进行彻底检修。这里有一些指导。基本规则是,对于无法处理的请求,返回nullptr

但首先,您必须规划要部署(和/或调试)程序集的位置。一个简单的布局是将JNI DLL所依赖的所有程序集放在与JNI DLL相同的文件夹中(将安装在GAC中的程序集除外)。然后,您可以使用它的位置来满足解析请求。但是,如果不存在包含具有请求名称的程序集的清单的文件,请记住返回nullptr。(你的".resources"请求可能就是这种情况。如果没有,那没关系,除非你知道其他情况。)

如果Reference Assemblies文件夹中的程序集不在GAC中,我会有点惊讶——但这取决于程序集提供商。Reference Assemblies用于设计和构建工具(例如Visual Studio)。(旧的方法是为每个版本的Visual Studio注册其中包含程序集的每个文件夹,以便程序集可以用于设计和生成。)如果GAC中没有依赖项,则可以使用引用上的"Copy Local"属性使其可用于调试。

您可能会发现程序集绑定日志查看器在设计和疑难解答时非常有用。使用它,您可以看到在调用AppDomain::AssemblyResolve处理程序链之前尝试的所有文件夹和扩展。(完成后禁用日志记录。)

相关文章:
  • 没有找到相关文章