簡體   English   中英

JNI調用.NET dll

[英]JNI to call .NET dll

我正在嘗試創建一個Java應用程序,該程序將通過中間Visula C ++ dll調用C#dll,當我嘗試從cmd提示符或Eclipse IDE運行.class文件時,一切都很好,但問題是為了做到這一點,我需要將C#dll與Java.exe放在同一目錄中,否則本機調用會發生異常,從而使得無法構建Java Project,有關如何執行此操作的任何想法

沒有COM,還有其他方法。 如果您無法更改.NET組件以支持COM客戶端,則可能會找到一種更好的選擇,或者需要一種。

當一個進程加載CLR時,程序集搜索路徑由該進程的主要Win32模塊的位置確定。 程序集搜索路徑與Win32 DLL搜索路徑不同。 在這種情況下,它從java.exe的位置開始。 其結果,搜索路徑包括全局程序集緩存(GAC),該文件夾java.exe ,和子文件夾作為組件列出探測在路徑java.exe.config (如果它存在)。

請參見運行時如何查找程序集

這導致一些選擇:

  1. 將組件安裝在GAC中。 (在最終用戶計算機上,應使用安裝程序,但在開發人員計算機上,可以使用gacutil 。)
  2. 將程序集放在java.exe文件夾中。 或者相反,將Java副本放入應用程序文件夾中。
  3. 創建一個具有程序集寫權限的子文件夾。 創建或更新java.exe.config並將子文件夾列出為探測路徑。
  4. 使用Java調用API在C或C ++中創建自己的java.exe 它與JNI一起記錄在案。 您可以隨意命名,因為畢竟這是您的應用程序。 (即使它們不使用.NET,許多基於Java的應用程序也會執行此操作。例如eclipse和LibreOffice。) 文檔提供了一個完整的C語言示例。對於典型的MSVC構建, jni.h需要在項目的包含路徑, jvm.lib必須位於項目的庫路徑中,而jvm.dll必須位於Win32 DLL搜索路徑中。

其他選擇:

  1. VC DLL可以在需要程序集之前從某個路徑顯式加載程序集。 參見Assembly :: LoadFile
  2. 在標准搜索未找到之后,按需加載程序集。 請參閱AppDomain :: AssemblyResolve事件 (但請注意,它的描述是錯誤的:直到您的自定義解析器發生故障,才發生故障)。

您可以使用COM Interop啟用並注冊您的托管(.NET)dll。 請參閱此鏈接: http : //support.microsoft.com/kb/828736

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM