2010-07-13 39 views
5

Chúng ta có thể biên dịch C thư viện như Net dll (chứa và truy cập mở cho tất cả các chức năng libs C) bằng cách chỉ cần soạn thảo dự án cpp chứa mã nhưCách thức Biên dịch thư viện C thành tệp .Net?

extern "C" { 
#include <library.h> 
} 

với /clr:pure tranh cãi với VS? (VS10)

Hoặc chúng ta nên làm một cái gì đó thêm trickey?

Trả lời

3

Tôi thấy rằng cách tốt nhất là sử dụng kiểu Managed C++ cũ cho việc này.

CLR:PURE chỉ cần không cắt.

Ví dụ:

extern "C" int _foo(int bar) 
{ 
    return bar; 
} 

namespace Bar 
{ 
    public __gc class Foo 
    { 
    public: 
    Foo() {} 

    static int foo(int bar) 
    { 
     return _foo(bar); 
    } 
    }; 
}; 

Compile với: /clr:oldSyntax

Bây giờ bạn có thể tham khảo các assebmly, và gọi Bar.Foo.foo() từ NET.

+0

Ý của bạn là gì - vui lòng cung cấp mẫu đơn giản? – Rella

+0

@Ole Jak: Đã thêm ví dụ. – leppie

+0

bạn có thể giải thích '__gc' là gì, mã này sẽ biên dịch thành .net dll như thế nào (tôi có nghĩa là chúng ta sẽ làm gì trong đó?) – Rella

3

Nó thực sự phụ thuộc vào mã C của bạn.

P/Gọi thường là dễ nhất để bắt đầu, và IMO khá khả thi đối với một số chức năng. Hiệu năng không nhất thiết phải tuyệt vời, và tôi sẽ không xây dựng toàn bộ chương trình từ nó - nhưng để tái sử dụng một số chức năng, nó đáng giá.

Đi từ C đến/clr: tinh khiết đòi hỏi bạn phải:

  1. Convert your C code to C++
  2. Convert your C++ code to Visual C++
  3. Compile with /clr option
  4. Compile with /clr:pure

Trạng thái hiện tại của mã của bạn (và đó là thư viện) sẽ quyết định quá trình đó gây đau đớn như thế nào.

+0

"thay" giả sử bạn không cần P/Gọi để sử dụng .Net dll. "thay" nói rằng bạn có thể biên dịch mã C++ (tệp CPP) thành .Net dll bằng cách sử dụng đối số 'clr: pure' với VS. – Rella

+0

@Ole - "Họ" là chính xác. Đó là nhận được điểm đó từ C mà có khả năng cung cấp cho bạn phù hợp. –

+0

Trong câu hỏi khác của ông (tôi đã mất, có thể năm) về điều này, Ole đặt ra một yêu cầu rằng tất cả mọi thứ biên dịch thành một tập tin duy nhất. 'DllImport' sẽ không đưa bạn đến đó. –

1

Thông thường, bạn không thể biên dịch mã C thành C++ mà không thực hiện một số thay đổi. Nếu bạn có thể lấy mã C của bạn để biên dịch thành C++, thì bạn có thể thử làm cho nó biên dịch thành C++/CLI (đó là tùy chọn clr: pure).

Tại thời điểm đó, bạn có thể tạo một số loại lớp hiển thị tất cả các hàm đã xuất của bạn dưới dạng phương thức tĩnh của lớp công khai (được quản lý).

Một số hương vị của loại công cụ này có thể được thực hiện với các thủ thuật tiền xử lý C++ (macro, v.v.), đôi khi bạn kết thúc bằng văn bản trình bao bọc thủ công. Vì vậy, thông tin cơ bản mà bạn có thể biên dịch C++ thành .NET assembly bằng cách sử dụng tùy chọn/clr: xxx là đúng, nhưng điều đó không có nghĩa đó là điều duy nhất bạn cần làm để có được một assembly .NET hữu dụng.

+0

được ra có bất kỳ từng bước tuts hoặc những câu chuyện của sucsess trong bài viết blog hoặc một cái gì đó như thế? – Rella

4

Điều này có thể quan tâm đến bạn: Compiling your C code to .NET

Tạo một trình biên dịch C occil.exe

Để tạo một dll NET từ một mã c ví dụ stack.c

Bước 1: xây dựng stack.c mã IL

occil /ostackdll.il /c /Wd /9 /NStackLib.Stack stack.c 

Bước 2: xây dựng mã IL được tạo ra để NET DLL

ilasm /DLL stackdll.il 

Sau đó, bạn có thể tham khảo các stack.dll trong aC# chương trình và gọi hàm C trong ngăn xếp .c

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