无法使用JNI4NET工具生成C#代理dll,将批处理文件作为可信汇编运行?

时间:2016-12-08 14:56:39

标签: java c# windows jni4net

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

我没有太多运气,所以我决定尝试使用样本执行相同的操作,特别是标题为myJavaDemoCalc的样本。在示例文件夹中执行generateProxies.cmd时会引发错误。

(如果需要,我会转录这张照片) enter image description here

我已经关注the link in the exception虽然我有点理解这意味着什么但我不确定是否必须安全地启用从远程源加载,因为它在链接文章的末尾建议。

我也很困惑为什么在我的generateProxies.cmd驱动器中运行C:并因此运行ProxyGen.exe时抛出异常。

任何人都知道我可以尝试下一步或知道这个问题吗?

此处参考的是来自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

1 个答案:

答案 0 :(得分:2)

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

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

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

  

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

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

enter image description here

如果您已将所有文件解压缩到文件夹,则可以使用powershell命令unblock-file

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

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

<?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>