Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java启动C#WPF会导致FileNotFoundException_C#_Java_Wpf_Java Native Interface_C++ Cli - Fatal编程技术网

从Java启动C#WPF会导致FileNotFoundException

从Java启动C#WPF会导致FileNotFoundException,c#,java,wpf,java-native-interface,c++-cli,C#,Java,Wpf,Java Native Interface,C++ Cli,我有一个现有的Java项目,它需要来自用C#编写的SDK的功能。它应该打开一个WPF窗口,并在关闭时将信息发送回Java 为了实现这两个世界的基本连接,我创建了一个调用本机函数的Java项目(“DotNetCaller”)。这些都是在一个C++/CLI项目(“DotNetBridge”)中实现的,该项目称为C#项目(“DotNetApplication”) 我已经可以在C#中设置Java中的字符串,并从C#回调到Java 但一旦我添加了WPF窗口并尝试使用以下工具启动它: Applicatio

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

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

我已经可以在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:\ProgramFiles(x86)\Reference 程序集\Microsoft\Framework.NETFramework\v4.0

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

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

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

您的处理程序可能需要彻底检查,并基于您自己对想要做什么的理解。有一些指导。基本规则是,对于无法处理的请求,返回
nullptr

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

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


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

谢谢,这已经让我更清楚了。我已经开始返回nullptr,现在我终于知道了原因。