2010-09-26 83 views
8

tôi muốn sử dụng dll được thực hiện trong C# (visual studio 2008) trong dự án C++ (visual studio 2003). làm thế nào để làm điều đó ? vui lòng heeelpsử dụng C# dll trong dự án C++

+2

thể trùng lặp của [Làm thế nào để sử dụng C# DLL trong vC++ ??] (http://stackoverflow.com/questions/980808/how-to-use-c-dll-in-vc) –

+1

thể trùng lặp của [Có thể sử dụng một DLL được tạo ra bằng cách sử dụng C# trong một ứng dụng VC++ không được quản lý?] (http://stackoverflow.com/questions/2873714/is-it-possible-to-use-a-dll-created-using- c-in-an-unmanaged-vc-application) –

+0

@ 0xA3: Tôi tò mò, VC++ sẽ làm mọi việc dễ dàng như thế nào? Mã được biên dịch trong VC 2003 có thể bao gồm các thành phần COM, và nó có thể bao gồm bất kỳ loại bản gốc wrapper DLL, ngay cả khi nó được viết bằng VC2008, phải không? – Niki

Trả lời

11

Có nhiều hơn chỉ là COM interop, các MSDN FAQ cũng liệt kê các phương pháp ít được biết đến:

2,2 Làm thế nào để gọi NET lắp ráp từ Visual C++ mẹ đẻ?

Về cơ bản có bốn phương thức để gọi hội đồng .NET từ mã VC gốc . Microsoft All-In-One Code Framework có các ví dụ hoạt động minh họa các phương pháp.

  1. Native VC++ mô-đun gọi CLR Hosting APIs để lưu trữ CLR, tải và gọi các assembly .NET. (All-In-One Mã khung Sample Code: CppHostCLR)

  2. Nếu assembly .NET có thể được tiếp xúc như là một thành phần COM, có nguồn gốc VC++ mô-đun có thể gọi vào lắp ráp NET qua NET - COM interop. (All-In-One Mã Khung mẫu Code: CppCOMClient)

  3. Xếp PInvoke: các quản lý bản địa gọi đang đi qua một đại biểu mã nguồn gốc có thể gọi lại. (All-In-One Mã Khung mẫu Code: CSPInvokeDll)

  4. Nếu module chứa nguồn gốc VC++ code được phép enable CLR, VC mẹ đẻ ++ mã có thể gọi lắp ráp NET trực tiếp thông qua “Nó Chỉ cần trình ", Hoặc" IJW ", cơ chế. (All-In-One Mã Khung Mã mẫu: CppCLIWrapLib)

1

Bạn không thể trực tiếp sử dụng các hội đồng .NET từ mã C++ không được quản lý. Một giải pháp có thể là để trưng bày assembly như đối tượng COM bằng cách sử dụng tiện ích regasm.exe và sau đó tiêu thụ nó từ C++. Lưu ý rằng các loại .NET cần được hiển thị với các đối tượng COM có thể cần được trang trí với thuộc tính [COMVisible(true)] và vẫn sẽ yêu cầu khung .NET được cài đặt trên máy tính mục tiêu đang chạy mã C++.

1

Có nhiều cách để thực hiện việc này.

Là C# DLL một DLL COM? Nếu vậy bạn có thể sử dụng thường xuyên COM API/Đặc điểm kỹ thuật để truy cập nó trong chương trình C++ của bạn. Có rất nhiều hướng dẫn về làm cho C# DLL COM của bạn có thể nhìn thấy. Nó không phải là khó khăn, một vài công tắc biên dịch và các thuộc tính C# về cơ bản.

Nếu không, bạn có thể biên dịch dự án C++ của mình bằng cách sử dụng công tắc trình biên dịch /clr không? Nếu vậy bạn có thể sử dụng số Using Directive để nhập trực tiếp C# DLL của mình.

0

Tạo tệp thư viện [.Tlb] và sau đó chỉ chúng tôi mới có thể sử dụng tệp của dll. Bạn phải tạo .TLB (Loại tệp thư viện) của C# DLL gốc của bạn và sử dụng thư viện đó.TLB trong mã VC++. Cho rằng bạn phải đăng ký .TLB tập tin trên máy của bạn cũng như nó là cần thiết để nhập khẩu tập tin .TLB trong vC++ apllication của bạn. Khi bạn viết C# DLL hãy nhớ sử dụng các giao diện sẽ được triển khai trong lớp.

1

Như Darin đã nói, một cách là thông qua COM. Hai cách khác (tôi biết) là:

  • Bạn có thể tạo một DLL chế độ hỗn hợp trong C++. DLL đó có thể chứa và gọi mã được quản lý, nhưng nó cũng có thể xuất các hàm không được quản lý, giống như một DLL C++ bình thường. Nó có thể được bao gồm giống như bất kỳ C++ DLL nào khác
  • Khó khăn hơn nhiều, nhưng bạn cũng có thể lưu trữ CLR. Google cho "lưu trữ CLR" để tìm chi tiết về API hoặc mẫu.
1

sau khi cài đặt "Resolve #using Tài liệu tham khảo" (dự án-> C/C++ -> General) biên dịch tùy chọn đến thư mục chứa assembly bạn muốn, sau đó bạn đặt một dòng như thế này trong mã của bạn.

#using <NiftyAssembly.dll> 
Các vấn đề liên quan