0

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

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

我已经可以在 C# 中设置来自 Java 的字符串以及从 C# 到 Java 的回调。

但是一旦我添加了一个 WPF 窗口并尝试使用以下命令启动它:

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

在 STA 线程中它崩溃了。

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

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

谁能告诉我我在这里真正想念什么?

谢谢

编辑:

我再次查看了这个示例,并尝试使其适应我的需要。我已将 ResolveEventHandler 的 dll 目录设置为“引用程序集”中的 .NET 目录

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0

并在 C# 中添加了一个窗口。

它也失败了,但在 C++ 部分而不是 C# 中有一个新的例外。使用空参数调用 ResolveHandler,导致 mscorelib 中出现无法捕获的异常。我添加了一个检查字符串是否为空,这种基本方法现在可以正常工作。

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

4

1 回答 1

1

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

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

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

您可能会发现程序集绑定日志查看器在设计和故障排除时很有用。有了它,您可以看到在放弃调用AppDomain::AssemblyResolve处理程序链之前尝试过的所有文件夹和扩展。(完成后禁用日志记录。)

于 2013-07-05T00:06:09.170 回答