2009-03-10 31 views
10

Tôi có ứng dụng C# sử dụng dll. Khi tôi cố gắng chạy ứng dụng, nó không thể tìm thấy dll, trừ khi nó nằm trong cùng một thư mục hoặc trong GAC. Tôi không muốn có nó trong cùng một thư mục và tôi không muốn cài đặt nó vào GAC. Có cách nào để nói cho ứng dụng biết nơi tìm thư viện không? (Ví dụ nếu tôi muốn phân phối ứng dụng cho khách hàng và họ muốn sử dụng các ứng dụng riêng của họ mà sẽ sử dụng dll.)Làm thế nào để thiết lập đường dẫn thư viện C# cho một ứng dụng?

Added:

Tôi muốn có cấu trúc tập tin này:

MainFolder: Libraries, ứng dụng

Libraries: lib.dll

ứng dụng: app1.exe

I don' t muốn sao chép nó vào GAC hoặc có lib.dll trong thư mục Ứng dụng. Có thể không?

+0

Tamara, bạn cũng có thể chỉnh sửa câu hỏi trước. Đó sẽ là cách ưa thích. –

+0

Tamara, câu hỏi này rất giống với câu hỏi này http://stackoverflow.com/questions/629459/c-cannot-find-library-during-runtime –

Trả lời

6
+0

Is'n về cơ bản giống như sao chép sang GAC? –

+0

Không, chúng khác nhau về mặt khái niệm. Bạn thậm chí có thể định tuyến lại một assembly được cài đặt trong GAC sang một phiên bản khác bằng phương thức này. Bạn phải chỉnh sửa cấu hình máy hoặc đặt DLL trong thư mục con. Tôi nghi ngờ bất kỳ người trong số họ là những gì bạn muốn, nhưng như GvS và Jon chỉ ra, đây không phải là một điều tốt trong chung –

0

Như tôi đã nói trong câu trả lời của tôi về câu hỏi trước đây của bạn:

Sử dụng Assembly Redirection hướng dẫn trong app.config hoặc Machine.config của bạn.

8

Tôi khuyên bạn nên áp dụng các ứng dụng của khách hàng sao chép các dll mà họ sử dụng trong thư mục của riêng họ.

VB6 sử dụng để chia sẻ dll của giữa các ứng dụng, chúng tôi có thời hạn cho việc này: DLL Hell

+0

+1 Câu trả lời tuyệt vời! Tôi phải upvote! –

+0

Vui lòng sử dụng thuật ngữ hiện đại hơn cho "DLL Hell" ---> Cache hội toàn cầu. =) Tôi nghĩ rằng MS có nghĩa là tốt ("Con đường đến địa ngục là ...") khi họ thực hiện GAC, nhưng nó cảm thấy giống như nỗi đau cũ ... ứng dụng kỳ lạ, thiếu chức năng, bước triển khai thêm, vv – StingyJack

1

Các DLL sẽ phải hoặc là được trong GAC hoặc trong thư mục của ứng dụng hoặc một thư mục con, như câu trả lời cho câu hỏi trước đó của bạn nói.

Nếu khách hàng của bạn muốn viết ứng dụng riêng của họ bằng cách sử dụng DLL, bạn nên cài đặt nó trong GAC hoặc yêu cầu họ sao chép tệp DLL. Có nhiều bản sao của thư viện không phải âm thanh như một điều tốt, nhưng nó thực sự là: nó có nghĩa là bạn có thể nâng cấp một bản sao lên một phiên bản khác mà không phá vỡ mọi thứ khác.

0

Bạn có thể đăng nhập, và sau đó xem các hành động mà khuôn khổ đã cố gắng để tải một hội đồng. Điều này làm cho chẩn đoán lỗi tải lắp ráp rất dễ dàng.

Công cụ để thực hiện cả hai là "FUSLOGVW.exe" (Fusion Log Viewer, Fusion là tên của bộ tải) và được bao gồm trong SDK.

4

Trong Main của bạn:

AppDomain.CurrentDomain.AssemblyResolve += (s,e)=>{ 
    var filename = new AssemblyName(e.Name).Name; 
    var path = string.format(@"C:\path\to\assembly\{0}.dll", filename); 
    return Assembly.LoadFrom(path); 
}; 

Thêm một số xử lý để ngoại lệ mà

+0

Cảm ơn ; trong trường hợp của tôi, người dùng của chúng tôi đều cài đặt SDK sản phẩm cụ thể và chúng tôi biết gần như thư viện ở đâu. Trình xử lý sự kiện AssemblyResolve chính xác là những gì tôi cần. – Epu

1

Có thể không GAC, nhưng hội phải mạnh mẽ được đặt tên và bạn phải thực hiện thay đổi để app.config bất cứ khi nào phiên bản hay thay đổi publickeytoken. Đây là những gì tôi có Chương trình chính trong \, Shared libs trong \ Shared. và một chương trình con tôi muốn tách ra trong \ SDK, nó sử dụng .. \ Shared cho các assembly.

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="shared" /> 
     <dependentAssembly> 
     <assemblyIdentity name="protobuf-net" publicKeyToken="257b51d87d2e4d67" /> 
     <codeBase version="1.0.0.282" href="../protobuf-net.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="SevenUpdate.Base" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.4.0" href="../SevenUpdate.Base.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="SharpBits.Base" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.5.0" href="../SharpBits.Base.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Windows" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.5.0" href="../System.Windows.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="WPFLocalizeExtension" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.5.0" href="../WPFLocalizeExtension.dll"/> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
Các vấn đề liên quan