2009-01-08 56 views
20

Chúng tôi có (thuần khiết C++) .DLL được xây dựng bởi VS. Là khách hàng, chúng tôi có một số ứng dụng C++ gốc và một .Net-Wrapper xung quanh DLL này được viết bằng C++/CLI. Cuối cùng có một số ứng dụng máy khách cho .Net-Wrapper được viết bằng C#.Làm thế nào để liên kết một .DLL tĩnh?

Vấn đề của tôi là tệp native.dll phải được phân phối theo cách khác với công việc của thế giới .Net và VS không theo dõi tệp DLL đó. Vì vậy, để cho tất cả các ứng dụng C# hoạt động chính xác, tôi phải sao chép nó vào mỗi thư mục thực thi hoặc đặt nó ở đâu đó trong% PATH% (mà tôi sẽ tránh trên máy tính của nhà phát triển vì chúng có thể muốn bắt đầu các ứng dụng khác nhau với các phiên bản DLL khác nhau) . Sự cố lớn hơn xảy ra nếu có UserControls tham chiếu đến Wrapper-DLL: Bạn phải sao chép tệp DLL vào thư mục của VS hoặc lại thành% PATH%. Nhưng trường hợp xấu nhất xảy ra với công cụ Dịch của chúng tôi. Công cụ này theo dõi .Net-Assemblies và gói chúng vào các gói Translator, có thể gửi tới một dịch giả bên ngoài. Theo tôi biết không có cách nào để đưa bản địa .DLL vào gói đó!

Vì vậy, tôi có kế hoạch liên kết DLL gốc tĩnh vào .Net-Wrapper sẽ giải quyết được sự cố của tôi. Nhưng đối với các ứng dụng Native của chúng tôi, DLL gốc này vẫn phải là một DLL.

Vì vậy, tôi có hai lựa chọn:

  • Làm cho hai dự án đó (một mà tạo ra một thư viện tĩnh; và một trong đó tạo ra một năng động => tôi cố gắng tránh điều này)
  • Tìm một giải pháp để liên kết DLL tĩnh
  • Tìm một cách để cho VS tạo ra hai kết quả đầu ra từ một dự án
+0

Tôi có thể hơi điên một chút ở đây, nhưng tôi không hiểu tại sao các ứng dụng bản địa của bạn không thể sử dụng dll gốc, và các ứng dụng .net của bạn sử dụng dll C++/cli-wrap. – Niklas

+0

Cả hai đều có thể. Nhưng Wrapper-DLL tham chiếu đến DLL gốc và vì vậy các ứng dụng C# của tôi cần cả hai. Đó là OK cho wrapper nhưng là đau trong ass cho DLL bản địa. – mmmmmmmm

+0

Tại sao không chỉ xây dựng một lib cho dll? Bạn nói rằng bạn xây dựng dll bằng cách sử dụng VS, không? –

Trả lời

4

Pick up một bản sao của DLL to Lib (Edit: Nếu bạn không thể tìm thấy một lựa chọn rẻ hơn)

+6

Một chút tốn kém, phải không? – mmmmmmmm

+1

Nó đặc biệt đắt tiền vì bạn đã có nguồn cho DLL. Bạn có thể biên dịch lại đơn giản dưới dạng tệp lib tĩnh. Tuy nhiên, Net sẽ không sử dụng nó kể từ khi. Net không làm các tập tin lib. Điều đó cũng có nghĩa là DLL To Lib sẽ không giúp bạn. –

+0

Whoaa, điều đó đã tăng lên khoảng 10 lần kể từ khi tôi mua nó một vài năm trước. Ouch! –

5

Một tùy chọn khác là có hai dự án, một dự án sẽ xuất ra tệp .lib có thể được liên kết tĩnh và dự án thứ hai sẽ xuất ra .dll và sẽ có .lib của bạn dưới dạng phụ thuộc, bạn nên thêm .def vào .dll của bạn với các biểu tượng mà bạn đang có kế hoạch xuất, nếu không nó sẽ trống.

+0

Âm thanh tốt. Tôi sẽ cho nó nó một cơ hội. Tại thời điểm này tôi đã giải quyết vấn đề bằng cách thêm obj-Files làm đầu vào bổ sung cho trình liên kết trong Wrapper-DLL (../NativeLib/$(PlatformName)/$(ConfigurationName)/*.obj). Nhưng đây là loại thô và các tùy chọn của bạn có vẻ tốt hơn! – mmmmmmmm

+0

Bất cứ ai có thể giải thích làm thế nào .lib và .dll đang nhận được phân biệt trong bối cảnh này? –

+0

Trong Visual Studio, bạn có hai loại ứng dụng khác nhau 'Thư viện tĩnh' và 'DLL'. Tùy chọn 'Thư viện tĩnh' tạo một tệp '.lib' nhưng không thể thực thi trực tiếp, mã đối tượng được đặt tất cả cùng nhau mà không cần xử lý. Tùy chọn 'DLL' sẽ tạo ra một '.dll' có thể thực thi (tức là bạn có thể sử dụng nó thông qua LoadLibrary), mã đối tượng được xử lý để giải quyết các cuộc gọi hàm, được tối ưu hóa. – Ismael

6

Trong tệp dự án C++ cho dll, hãy tạo hai cấu hình, một cấu hình tạo DLL và một tệp tạo ra tệp .lib. Hai dự án là không cần thiết, vì bất kỳ dự án .NET/C++ nào cũng có thể hỗ trợ nhiều cấu hình xây dựng (đây là cách các phiên bản Release và Debug xây dựng khác nhau).

+0

Nhưng không có cách nào để xây dựng hai cấu hình của cùng một dự án trong một lần, phải không? Thông thường, bạn có thể chọn một cấu hình/nền tảng dự án trong trình quản lý cấu hình cho cấu hình/nền tảng giải pháp. – mmmmmmmm

+0

Bạn có thể sao chép dự án và có dự án thứ hai được định cấu hình khác trong giải pháp đó. đừng quên đặt các thư mục trung gian khác nhau – thewhiteambit

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