2012-01-09 43 views
6

Tôi đang cố gắng tham khảo một DLL được quản lý trong dự án .NET của tôi, mà không cần sao chép nó vào thư mục đầu ra của tôi. Vì vậy, khi chương trình của tôi chạy, nó chạy DLL từ vị trí mà nó được cài đặt - ở bất cứ đâu. Vấn đề nằm trong thực tế là DLL được quản lý này gọi các DLL không được quản lý. Khi tôi thử và tham khảo DLL được quản lý, nó sẽ ném một số FileNotFound Exception - Could not load file or assembly 'CharacterGen' or one of its dependencies. The system cannot find file specified. Khi tôi đặt đầu ra của mình nằm trong cùng thư mục với DLL tôi đang tham chiếu, mọi thứ đều hoạt động tốt. Các giải pháp thông thường sẽ là cũng tham khảo các DLL được gọi là từ bên trong hội đồng khác. Tuy nhiên, tôi không thể tham khảo các assembly không được quản lý từ chương trình quản lý của tôi.Tham chiếu không được quản lý

Có cách nào để tham khảo một DLL được quản lý có gọi là các tệp DLL không được quản lý không?

+0

Bạn có quen thuộc với GAC ..? nếu bạn không muốn sao chép vào thư mục bin sau đó tạo một thư mục riêng biệt nhưng bạn vẫn sẽ cần phải sao chép của .dll vào thư mục đó, giới thiệu chúng vv .. nếu không bạn sẽ phải làm một số mã LoadFromAssebly bằng cách sử dụng đường dẫn tìm kiếm tại sao bạn không muốn chỉ sao chép của .dll vào một vị trí có thể được tham chiếu đúng .. cũng haave bạn nghĩ về việc tạo một trình cài đặt MSI theo cách đó nếu người dùng muốn chạy ứng dụng của bạn/thiết lập nó trong một cấu trúc thư mục khác .. ít nhất họ có thể làm điều đó và các phụ thuộc tham chiếu liên quan sẽ được xử lý .. – MethodMan

+0

Tôi không quá quen thuộc với GAC nhưng từ những gì tôi hiểu, hội đồng phải được ký kết. Tôi không có quyền kiểm soát các DLL tôi đang tham khảo vì vậy tôi không thể xác minh nếu họ đã ký kết hay không. Tôi nghĩ về một trình cài đặt, nhưng tôi không muốn cài đặt vào thư mục hiện có của người dùng vì nó không phải là thư mục của chương trình của tôi, nó là một thư mục tồn tại trên các máy khách của tôi. Đó sẽ là dự phòng của tôi nếu không có gì khác hoạt động. – XSL

+1

GAC không hữu ích khi tham khảo các tệp DLL không được quản lý. – BrainSlugs83

Trả lời

14

Nếu bạn hỏi làm thế nào để có được visual studio để sao chép các DLL không được quản lý vào thư mục đầu ra, bạn có thể làm điều này:

  1. Thêm dll không được quản lý như một tập tin hoặc tập tin được liên kết trong dự án của bạn. (nhấp chuột phải dự án -> add -> tập tin hiện có sau đó hoặc Thêm hoặc Thêm dưới dạng Liên kết).
  2. Chọn tệp trong trình khám phá giải pháp. Trong cửa sổ thuộc tính, hãy thiết lập hành động xây dựng để luôn sao chép.
+2

Đừng quên rằng DLL không được quản lý có thể yêu cầu các DLL không được quản lý khác. Nếu bạn quên thêm chúng, bạn có thể gặp lỗi chính xác. Bạn có thể sử dụng phụ thuộc tập đi để giúp bạn nếu bạn không chắc chắn những gì là phụ thuộc. – insipid

+1

"Sao chép nếu mới hơn" hoạt động tốt hơn. –

+0

Cảm ơn! Chỉ cần sửa bạn, Sao chép Luôn không nằm trong "Xây dựng Hành động", nó nằm trong "Sao chép vào Thư mục Đầu ra" –

0

Nếu giải pháp của bạn có một loạt các không được quản lý C++ dlls rằng bạn đang xây dựng và một hoặc hai quản lý C# hội, và tất cả họ đều cần phải được trong cùng một thư mục, tôi đã tìm thấy rằng cài đặt tất cả các dự án sử dụng cùng một thư mục đầu ra để trở thành giải pháp dễ quản lý nhất. - Bằng cách này, nếu các dự án được đổi tên sau, vv, tất cả chúng vẫn kết thúc ở đúng vị trí, và nếu bạn thêm một dự án mới sau này, bạn không cần phải tìm ra những dll cần được thêm vào, bạn chỉ cần đặt OutputPath cho chính xác điều tương tự như các dự án khác của bạn.

Để đạt được điều này, tôi đặt thuộc tính OutputPath (cho tất cả Cấu hình và Nền tảng, cho mọi dự án) thành $(SolutionDir)\bin\$(Configuration).

Nói chung, tôi không bao gồm $(Platform) trong đường dẫn, bởi vì đối với các dự án không được quản lý nó được đặt tên Win32 và cho quản lý nó được đặt tên x86 - nhưng nếu bạn thực sự cần nền tảng phân biệt bạn có thể làm một số logic có điều kiện trong csproj tệp để tạo thuộc tính mới có giá trị mong muốn.

Các vấn đề liên quan