2013-07-04 38 views
0

我有一個現有的Java項目,它需要使用C#編寫的SDK的功能。它應該打開一個WPF窗口並將信息發送回Java。從Java啓動C#WPF會導致FileNotFoundExceptions

對於這兩個世界的基本連接,我創建了一個調用本地函數的Java項目(「DotNetCaller」)。這些實現在調用C#項目(「DotNetApplication」)的C++/CLI項目(「DotNetBridge」)中。

我已經可以在C#中從Java中設置字符串,並從C#到Java回調。

但只要我添加了一個WPF窗口,並嘗試以啓動它:

Application app = new Application(); 
app.Run(new DotNetWindow()); 

在STA線程崩潰。

DotNetApplication沒有找到mscorlib.resources,我提供的DLL後,PresentationFramework.resources丟失,如果我提供,DotNetApplication.resource丟失(我不能提供)。

如果我單獨調用DotNetApplication或者從DotNetBridge調用,窗口按預期顯示。

任何人都可以告訴馬我在這裏真的很想念嗎?

感謝

編輯:

我看着this example一次,並試圖使其適應我的需要。 我已經設置了ResolveEventHandler的DLL目錄中的 「引用的程序集」

C中的.NET DIR:\程序文件(x86)\參考 大會\微軟\ Framework.NETFramework \ V4.0

並在C#中添加了一個窗口。

它失敗了,但在C++部分而不是C#中出現了新的異常。 ResolveHandler被一個空參數調用,導致mscorelib中出現不可捕捉的異常。 我添加了一個檢查,如果字符串是空的,這種基本方法現在工作正常。

我仍然不確定我是否有正確的方法,所以請隨時提供。

回答

1

您的AppDomain::AssemblyResolve處理程序可能需要進行大修,並根據您自己對要執行的操作的理解。有一些指導here。基本規則是,您返回nullptr來處理您無法處理的請求。

但首先你必須規劃你想部署(和/或調試)你的程序集的位置。一個簡單的佈局將把你的JNI DLL所依賴的所有程序集放在與JNI DLL相同的文件夾中(除了將安裝在GAC中的任何程序集)。然後,您可以使用其位置來滿足解決方案請求。但是,如果沒有包含具有請求名稱的程序集清單的文件存在,請記得返回nullptr。 (您的「資源」請求可能會出現這種情況,除非您知道其他情況,否則沒有問題。)

如果Reference Assemblies文件夾中的程序集也不在GAC中,我會有點驚訝,但它會由程序集提供者提供。 Reference Assemblies用於設計和構建工具(例如Visual Studio)。 (舊方法是爲每個版本的Visual Studio註冊程序集的每個文件夾進行註冊,以便程序集可用於設計和構建。)如果依賴項不在GAC中,則可以使用「複製本地「屬性上的參考使其可用於調試。

在設計和排除故障時,您可能會發現Assembly Binding Log Viewer有用。有了它,您可以看到所有在嘗試調用AppDomain::AssemblyResolve處理程序鏈之前嘗試過的文件夾和擴展。 (完成後禁用日誌記錄。)

+0

謝謝,已經讓我對它更加清楚。我已經開始返回一個nullptr,現在我終於知道爲什麼了。 –

相關問題