2009-07-21 7 views
12

Chúng tôi hiện đang thử nghiệm Mono để xem liệu .NET DLLs của chúng tôi có hoạt động với khách hàng trên Linux hay không. DLL của chúng tôi cung cấp các thành phần cho Windows Forms. Tôi đã đặt các tệp DLL trong thư mục Debug, thêm các tham chiếu và tạo một lớp bắt nguồn từ một Biểu mẫu Windows. Các lớp đã chạy độc lập tốt, nhưng sau khi tôi thêm các tài liệu tham khảo DLL và tạo ra một trong những thành phần của chúng tôi (IntelliSense làm việc tốt), nó biên dịch nhưng sẽ không chạy:Sử dụng Biên dịch DLL hội tụ sẵn trong Mono?

 
** (/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' 

tôi nhìn vào tính chất của hội đồng, và đó là phiên bản với khóa công khai đó.

Có cách nào để tôi sử dụng các tệp DLL này không? Tôi đang làm gì sai?

EDIT:

Theo MoMA, trừ một số s [MonoTodo] mà không có mang về tình hình, có một vấn đề trong ba DLL:

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

Tuy nhiên, tôi đã mở một trong những dự án mẫu của chúng tôi được tạo ra với VS2008, chỉ ra tham chiếu đến DLL ở đúng nơi và nó hoạt động tốt. Nhưng tôi không thể có được tham chiếu để làm việc trong một dự án mới. Tôi có làm điều gì sai?

EDIT 2: Để làm rõ, chúng tôi không muốn tạo lại một ứng dụng cửa sổ hiện có - chúng tôi đang mô phỏng khách hàng tạo ứng dụng mới với dll của chúng tôi. Tôi đã chỉ thử nghiệm để xem nếu nó là một vấn đề dll. Kể từ khi ứng dụng VS-thực hiện đã có thể tìm thấy dll và chạy thành công, nó sẽ có vẻ nó không phải là một vấn đề dll. Ứng dụng mới không gọi bất kỳ ứng dụng nào do VS tạo ra.

Trả lời

9

Tôi muốn thử nghiệm DLL với MOMA (Mono Migration Analyzer) để xem liệu nó có đang sử dụng API không được hỗ trợ hay không.

+0

Chỉ cần thêm chi tiết MoMA ở trên. Tuy nhiên, nó hoạt động tốt với ứng dụng mẫu. Chỉ cần không phải với các ứng dụng mới được tạo ra với MonoDevelop. – NickAldwin

+0

Bạn không (không nên) cần tạo lại ứng dụng trong MonoDevelop. Mono sẽ có thể chạy DLL được biên dịch trong Visual Studio. Tôi sẽ nhìn vào đó ComboBoxControl.SetWindowsTheme gọi - đó là thực hiện cuộc gọi p/gọi, có nghĩa là nó sẽ không được hỗ trợ trong Mono. Bạn có thể loại bỏ nó, hoặc không sử dụng điều khiển đó? –

+0

Chúng tôi không muốn tạo lại nó - chúng tôi đang mô phỏng một khách hàng tạo một ứng dụng mới với dll của chúng tôi. Tôi đã chỉ thử nghiệm để xem nếu nó là một vấn đề dll. Kể từ khi ứng dụng VS-thực hiện đã có thể tìm thấy dll và chạy thành công, nó sẽ có vẻ nó không phải là một vấn đề dll. Ứng dụng mới không gọi bất kỳ ứng dụng nào do VS tạo ra. – NickAldwin

4

Bạn thường có thể tìm thêm thông tin chi tiết về lỗi tải .dll bằng cách chạy với:

MONO_LOG_LEVEL = "debug" MONO_LOG_MASK = "dll" mono MyApp.exe

+0

Cảm ơn câu trả lời, nhưng sau khi thiết lập các biến môi trường mono vẫn không cung cấp thêm thông tin cho tôi. – NickAldwin

6

gì Jonathan nói là đúng, bạn cần phải chạy lệnh như được hiển thị và nó sẽ tạo ra một lượng thông tin dồi dào.

Hội đồng có tên mạnh, vì vậy có vẻ như trên Windows bạn có một sự phụ thuộc được cài đặt trên GAC. Nếu "OUR.ASSEMBLY" được coi là có, chạy:

gacutil -i OUR.ASSEMBLY.dll

Để cài đặt nó. Có thể có các phụ thuộc khác mà OUR.ASSEMBLY.dll cần là lệnh JPobst 'sẽ hiển thị.

+0

Mặc dù vậy, chúng tôi không sử dụng GAC. – NickAldwin

+2

Chắc chắn, nhưng bạn mạnh mẽ đặt tên cho hội đồng đó, vì vậy Mono sẽ tìm kiếm nó trên GAC. Bạn có thể ghi đè điều này với "xuất MONO_PATH = DIR" cho mục đích chẩn đoán (nó sẽ chỉ huy Mono để tìm kiếm hội đồng trong DIR, bất kể tên mạnh của nó). –

4

Các vấn đề có khả năng là lắp ráp không được đặt trong cùng thư mục với chương trình hoặc độ nhạy trường hợp của tên tệp lắp ráp không được giữ nguyên khi được sao chép. Ví dụ: Ví dụ: bạn có thể có tham chiếu OUR.ASSEMLY, nhưng tên tệp là OurAssembly.DlL hoặc bất kỳ kết hợp trường hợp không hợp lệ nào khác mà mọi người có thể đưa ra.

+0

Tôi chắc chắn rằng nó đã được trong cùng một thư mục và cùng một trường hợp, và nó vẫn dẫn đến lỗi. – NickAldwin

+0

Nếu bạn không ewant để đăng nhật ký đầu ra từ thiết lập các vv env, bạn có thể muốn thử và thực hiện mono theo strace: strace -f -e mở mono yourtest.exe và xem tệp nào đang cố gắng tải và ở đâu. – lupus

1

uxtheme.dll là công cụ chủ đề của Windows, nếu tôi không nhầm. Nó khá tự nhiên bạn không có trong môi trường không phải Windows, vì vậy P/Gọi các chức năng xuất khẩu của nó không trực tiếp có thể.

Bạn có hai lựa chọn ở đây:

  1. Mở rằng OnHandleCreated phương pháp và thay thế các cuộc gọi SetWindowTheme với một cái gì đó di động hoặc
  2. Tạo một hình nộm libuxtheme.so có chứa chỉ là một chức năng này để mono có thể P/Gọi nó .

Tôi khuyên bạn nên sử dụng phương pháp đầu tiên nếu có thể, vì bạn cần tạo ra hình ảnh giả libuxtheme.so cho mọi nền tảng bạn đang hỗ trợ. Tức là, bạn phải tạo một số libuxtheme.so cho x86 Linux, libuxtheme.so cho x86_64 Linux, giống với FreeBSD, một libuxtheme.dylib dành cho Mac OS X v.v.

Nếu OnHandleCreated được tạo bởi một số nhà thiết kế giao diện người dùng hoặc tương tự, bạn có thể phải xóa một số chủ đề tiện ích để loại bỏ cuộc gọi.