2

我正在努力让工具 JNI4NET正常工作,以便我可以使用我在 C# 应用程序中拥有的一些 Java 代码。作为一个简单的初始测试,我创建了一个简单的 Java 类库,其中包含一个类Person和一个方法public String GetName() { return "NoBody"; }。从这里开始,我一直按照 JNI 下载中给出的示例进行编辑,generateProxies.cmd以创建 jar 的 DLL 包装器。

我对此运气不佳,因此我决定尝试执行相同的操作,但使用示例,特别是标题为 的示例myJavaDemoCalcgenerateProxies.cmd在示例文件夹中执行时会引发错误。

(如果需要,我会转录这张照片) 在此处输入图像描述

我已经按照异常中的链接进行了操作,虽然我有点理解这意味着什么,但我不确定启用从远程源加载是否一定安全,正如链接文章末尾所建议的那样。

我也很困惑为什么抛出异常,因为看到generateProxies.cmdProxyGen.exe 正在从我的C:驱动器运行。

有人知道我接下来可以尝试什么或知道这里的问题吗?

供参考这里是generateProxies.cmd来自myJavaDemoCalc

@echo off
copy ..\..\lib\*.* work
..\..\bin\proxygen.exe work\myJavaDemoCalc.jar -wd work
cd work
call build.cmd
cd ..

echo compiling usage
csc.exe /nologo /warn:0 /reference:work\jni4net.n-0.8.8.0.dll /reference:work\myJavaDemoCalc.j4n.dll /out:work\demo.exe /target:exe MyCalcUsageInDotnet.cs
4

1 回答 1

4

我假设您下载了该 zip 文件,然后立即提取了所有文件。

但是,由于该 zipfile 确实来自不受信任的区域,即 Internet,因此其中的文件也将保持不受信任。它包含带有区域标识符的备用数据流。

当这些程序集被框架加载时,它会检查它们是否可以信任。仍然存在该区域标识符的程序集不会被加载。那是你得到的例外:

System.IO.FileLoadException:无法加载文件或程序集“file:///jni4net.n-0.8.8.0.dll”或其依赖项之一。不支持操作。(来自 HRESULT 的异常:0x80131515)--->
System.NotSupportedException:尝试从网络位置加载程序集,这会导致程序集在以前版本的 .NET Framework 中被沙盒化。此版本的 .NET Framework 默认情况下不启用 CAS 策略,因此这种加载可能很危险。如果此加载不打算对程序集进行沙箱处理,请启用 loadFromRemoteSources 开关。

解决此问题的最快解决方案是打开下载的 zip 文件的属性窗口,并在提取所有文件unblock 之前打勾:

在此处输入图像描述

如果您已经将所有文件提取到一个文件夹中,则可以使用 powershell 命令unblock-file

Get-ChildItem -Path 'c:\path\to\files' -Recurse | Unblock-File

但是,如果您确定将始终使用受信任的程序集运行 proxygen.exe,则可以通过loadFromRemoteSources在现有 proxygen.exe.config 中添加元素来添加 MSDN 文章中提供的建议:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
  <!-- trust all the thingz -->
  <runtime>
    <loadFromRemoteSources  enabled="true"/>
  </runtime>
</configuration>
于 2016-12-08T16:03:01.990 回答