2014-08-30 43 views
1

我有一個通過Unmanaged Exports導出功能的.NET(C#)dll,它正在被Java應用程序使用。使用JNA加載相關.NET程序集

這個C#DLL(我們稱之爲A.dll)有另一個託管依賴F3BC4DNI.dll。

因此,依賴關係鏈是這樣的:Java類< - JNA < - A.DLL < - F3BC4DNI.dll

不需要說,所有的DLL都包含在一起的應用程序bin文件夾。

然而,這個過程被稱爲javaw.exe的下運行的所有Java二進制文件,然後當我試圖通過A.DLL JNA消費,它尋找F3BC4DNI.dll 的javaw.exe的路徑,而不是同一個文件夾內A.DLL如可以在進程監視器中可以看出:

Dependency being searched inside javaw directory

我的猜測是,A.DLL(.NET)尋找依賴性時,假設進程路徑

我已經嘗試了很多可能的解決方案,例如設置PATH環境變量,設置JNA庫路徑以及我試圖使用Assembly.LoadFrom明確加載A.dll中的B.dll程序集。

結果總是相同的當Java應用程序運行:

Exception in thread "main" java.lang.Error: Invalid memory access 
    at com.sun.jna.Native.invokePointer(Native Method) 
    at com.sun.jna.Function.invokePointer(Function.java:470) 
    at com.sun.jna.Function.invokeString(Function.java:651) 
    at com.sun.jna.Function.invoke(Function.java:395) 
    at com.sun.jna.Function.invoke(Function.java:315) 
    at com.sun.jna.Library$Handler.invoke(Library.java:212) 

當我這些DLL文件複製到Program Files \ Java的...斌\文件夾,它的工作原理,但很明顯,我不不想在生產中以這種方式部署它。

畢竟,我假設的唯一的事情是它不是Java或JNA方面的問題,因爲它是.NET相關的依賴項,所以我必須以某種方式告訴javaw.exe .NET依賴關係在另一個夾。

回答

0
[...]I have to somehow tell javaw.exe that .NET dependencies are in another folder. 

就像我懷疑,手動告訴到.NET,其中依賴性是指,問題已經解決了,使用應答from this post

/// <summary> 
/// Initializes a new instance of the <see cref="T:System.Object"/> class. 
/// </summary> 
static A() 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => 
    { 
     var path = Path.Combine(Directory.GetCurrentDirectory(), "bin\\F3BC4DNI.DLL"); 
     return Assembly.LoadFile(path); 
    }; 
}