2010-11-09 24 views

Trả lời

2

Tôi giả định Lớp C# là lớp tĩnh. Bạn cần tạo một lớp interop trong C++/CLI trước khi bạn có thể sử dụng nó trong tinh khiết C. Tạo một lớp học C++/CLI để bọc lớp học C# của bạn. Khi việc đó được thực hiện, hãy sử dụng hàm xuất để xuất các hàm C cụ thể. C++/CLI sẽ quản lý interop thay cho bạn. Quy tắc của ngón tay cái là nếu bạn lớp/chức năng có bất kỳ CLI nó sẽ CLI. Vì vậy, các hàm bên ngoài của bạn chỉ nên trả về kiểu dữ liệu gốc.

extern "C" __declspec(dllexport) int MyFunc(long parm1); 

Đây là bài viết giúp bạn bắt đầu. Nó chuyển đổi C++ thành C# nhưng quy trình được đảo ngược trong trường hợp của bạn. CodeProject Thật không may là không có thuận tiện đảo ngược PInvoke cho tinh khiết C.

Rất tiếc, tôi chưa bao giờ rời khỏi C# đến C. Nghe có vẻ như một dự án thú vị. Chúc may mắn!

Ok Nếu bạn chưa tìm ra, tôi có mẫu nhanh cho bạn.

C# CSLibrary.Math.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace CSLibrary 
{ 
    static public class Math 
    { 
     static public int Add(int a, int b) 
     { 
      int c = a + b; 
      return c; 
     } 
    } 
} 

CPP/C++ Dự án CPPCLibrary.h (Biên soạn với C++/CLI Tùy chọn với phụ thuộc dự án)

#pragma once 

using namespace System; 

extern "C" __declspec(dllexport) int MathAdd(int a, int b) 
{ 
    return CSLibrary::Math::Add(a, b); 
} 

C Dự án CTest .c (Biên dịch thành Mã C)

#include "stdafx.h" 
#pragma comment(lib, "../Debug/CPPCLILibrary.lib") 

extern __declspec(dllimport) int MathAdd(int a, int b); 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int answer = MathAdd(10, 32); 
    _tprintf(_T("%d\n"), answer); 
    return 0; 
} 

Tất cả các tệp đều có cùng giải pháp nhưng các dự án khác nhau. Tôi đã xác nhận điều này đã làm việc. Tôi hy vọng điều này sẽ giúp bất cứ ai đi qua nó.

Chúc mừng!

+0

Nếu tôi có thời gian tôi muốn tạo một bản trình diễn nhỏ. Điều này nghe có vẻ vui. –

0

Nếu mã là C thuần khiết, bạn có thể đặt nó vào C++ trực quan dự án lắp ráp mà không gặp quá nhiều khó khăn. Từ đó, bạn sẽ có quyền truy cập vào một api .net thông thường.

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