2010-01-19 29 views
7

Có vẻ như Mono bỏ qua dllmaps trong tệp cấu hình cục bộ.mono bỏ qua dllmaps trong tệp app.config

Tôi muốn chuyển ứng dụng .NET của tôi trên Linux (ubuntu) gọi các thư viện gốc để tôi có dllmaps để làm cho mã của tôi hoạt động. Các tài liệu mono nói rằng bạn phải tạo một tệp something.exe.config cho something.exe và đặt các cấu hình ứng dụng cụ thể vào nó. nó phân tích các tập tin (vì nó phàn nàn nếu tôi thực hiện một số lỗi chính tả trong đó) và tên tập tin là chính xác nhưng có vẻ như nó bỏ qua các dllmaps.

Các tập tin cấu hình rất đơn giản:

<configuration> 
<dllmap dll="i:openal32.dll" target="libopenal.so" /> 
</configuration> 

Mono không tìm thấy Openal32.Dll và ném DllNotFoundException. Nhưng nếu tôi sao chép mục nhập dllmap đó trong tệp/etc/mono/config chính thì mọi thứ đều ổn. Nếu thực hiện thủ thuật $ MONO_LOG_LEVEL = debug mono ... để xem nó hoạt động như thế nào và tôi thấy không có nỗ lực nào để tải libopenal.so. Nhưng nhiều cố gắng tải libopenal32.dll, ./libopenal32.dll libopenal32.so, openal32.so, vv.

Có lẽ tôi lại gặp lỗi Mono?

Tôi muốn đóng gói tệp cấu hình này trong lưu trữ và tôi không muốn yêu cầu người dùng của mình gây rối với tệp/etc/mono/config.

Bất kỳ ý tưởng nào?

Trả lời

7

Tất cả các thuộc tính DllImport của bạn có trong mã bằng cách sử dụng "openal32.dll" hoặc một số sử dụng "openal32" thay thế không? Trong mọi trường hợp, tệp cấu hình tham chiếu đến assembly chứa các phương thức P/Invoke: vấn đề có thể xảy ra nhất là bạn đã tạo cấu hình cho assembly chính trong khi các phương thức P/Invoke nằm trong một assembly riêng biệt. Chỉ cần đổi tên tệp thành OpenAlUsingAssembly.dll.config.

+0

Đó là vấn đề ... Tôi đã viết tập tin cấu hình để lắp ráp sai. Một trong những tài liệu tham khảo của tôi sử dụng dll không phải là ứng dụng chính. – Calmarius

+0

+1 bạn có một tài liệu viết tắt đơn giản về tương lai tươi sáng. :) –

1

Tôi vừa gặp sự cố tương tự khi cố gắng chạy chương trình thử nghiệm OpenAL (thực sự OpenTK) của mình theo Ubuntu 12.04. Cuối cùng tất cả những gì cần làm là:

sudo apt-get install libopenal1 

Để có được các thư viện thời gian chạy OpenAL và sau đó tạo ra một tập tin gọi OpenTK.dll.config chứa:

<configuration> 
    <dllmap dll="i:openal32.dll" target="libopenal.so.1" /> 
</configuration> 

Những ánh xạ các nhập khẩu trong OpenTK.dll từ các tập tin windows openal32.dll đến phiên bản chính xác của thư viện được chia sẻ dưới Linux, đó là trường hợp của tôi là libopenal.so.1 (mà thực sự xuất hiện để được chỉ là một liên kết đến libopenal.so.1.13.0).