2009-07-21 57 views
12

我們目前正在測試Mono以查看我們的.NET DLL是否適用於Linux上的客戶。我們的DLL爲Windows窗體提供組件。我將DLL放在Debug目錄中,添加了引用,並創建了一個從Windows窗體派生的類。該上課了運行良好的獨立,但之後我加入了DLL引用,並創建了我們的組件之一(智能感知工作得很好),它編譯但不會運行:在Mono中使用預編譯的.NET程序集DLL?

 
** (/home/aldwin/testMonoWF/testMonoWF/bin/Debug/testMonoWF.exe:26905): WARNING **: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies. 

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies. 
File name: 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' 

我看着組件的性能,它就是那個帶有該公鑰的版本。

有沒有辦法讓我使用這些DLL?我究竟做錯了什麼?

編輯:

據紐約現代藝術博物館,比對情況沒有影響一些[MonoTodo] S以外,還有三個在DLL中的一個問題:

 
Calling Method | P/Invoke Method | P/Invoke Library 
void OnHandleCreated (EventArgs) | int GoText/ComboBoxControl.SetWindowTheme (IntPtr, string, string) | uxtheme.dll 

不過,我打開我們使用VS2008創建的示例項目之一,在正確的位置指向了DLL的引用,並且它工作正常。但我無法獲得參考在新項目中工作。難道我做錯了什麼?

編輯2: 爲了澄清,我們不想重新創建現有的Windows應用程序 - 我們正在模擬客戶使用我們的dll創建新的應用程序。我只是測試,看看這是否是一個DLL問題。由於VS製作的應用程序能夠找到dll併成功運行,它似乎不是一個dll問題。新的應用程序不會調用VS創建的應用程序沒有的任何東西。

回答

9

我會用MOMA (Mono Migration Analyzer)來測試DLL,看看它是否使用不支持的API。

+0

剛剛在上面添加了MoMA詳細信息。不過,它可以很好地與示例應用程序一起運行只是不適用於使用MonoDevelop製作的新創建的應用程序。 – NickAldwin 2009-07-21 19:49:20

+0

您不需要(不應該)需要在MonoDevelop中重新創建應用程序。 Mono應該能夠運行在Visual Studio中編譯的DLL。我會看看ComboBoxControl.SetWindowsTheme調用 - 這是進行p/invoke調用,這意味着它不會在Mono中受支持。你可以刪除它,或不使用該控件? – 2009-07-21 20:08:43

+0

我們不想重新創建它 - 我們正在模擬客戶使用我們的dll創建新的應用程序。我只是測試,看看這是否是一個DLL問題。由於VS製作的應用程序能夠找到dll併成功運行,它似乎不是一個dll問題。新的應用程序不會調用VS創建的應用程序沒有的任何東西。 – NickAldwin 2009-07-21 20:26:41

4

您可以通過運行通常坐上.dll文件加載錯誤的詳細信息:

MONO_LOG_LEVEL =「調試」 MONO_LOG_MASK =「DLL」單程序myapp.exe

+0

感謝您的回答,但設置了單聲道環境變量後,仍然沒有給我任何更多信息。 – NickAldwin 2009-07-21 20:35:25

6

什麼喬納森說是正確的,你需要運行命令如圖所示,它會產生大量的信息。

該程序集有一個很強的名稱,所以聽起來像在Windows上,您有一個安裝在GAC上的依賴項。如果 「OUR.ASSEMBLY」 應該是有,運行:

GACUTIL -i OUR.ASSEMBLY.dll

要安裝它。 OUR.ASSEMBLY.dll可能存在其他依賴項,這是JPobst的命令將顯示的內容。

4

可能的問題是程序集沒有放在與程序相同的目錄中,或者程序集文件名的區分大小寫在複製時未保留。 例如,您可能有OUR.ASSEMLY引用,但文件名是OurAssembly.DlL或任何其他無效的案例組合,人們可以提出。

1

uxtheme.dll是Windows的主題引擎,如果我沒有弄錯的話。在非Windows環境中這是非常自然的,所以P /調用其導出的函數不是直接可能的。

你這裏有兩種選擇:

  1. 打開該OnHandleCreated方法並替換SetWindowTheme調用的東西便攜式或
  2. 創建一個虛擬libuxtheme.so只包含這一個功能,所以單可以P/Invoke它。

如果可能的話,我推薦第一種方法,因爲您需要爲您支持的每個平臺創建虛擬libuxtheme.so。也就是說,你必須爲x86 Linux製作libuxtheme.so,x86_64 Linux製作libuxtheme.so,FreeBSD製作相同,Mac OS X製作libuxtheme.dylib等等。

如果OnHandleCreated是由某個UI設計人員等生成的,那麼您可能必須刪除一些控件主題,才能刪除該調用。