C # 'dan C ++ kodunu çağırmak mümkün mü?


Yanıtlar:


90

C ++ 'yı çağırmanın kolay bir yolu, C ++ / CLI'de bir sarmalayıcı derlemesi oluşturmaktır. C ++ / CLI'de, yerel kod yazıyormuşsunuz gibi yönetilmeyen kodu çağırabilirsiniz, ancak C # 'dan C ++ / CLI kodunu C # ile yazılmış gibi çağırabilirsiniz. Dil, temelde "katil uygulaması" olarak mevcut kitaplıklarla birlikte çalışacak şekilde tasarlandı.

Örneğin - bunu / clr anahtarıyla derleyin

#include "NativeType.h"

public ref class ManagedType
{
     NativeType*   NativePtr; 

public:
     ManagedType() : NativePtr(new NativeType()) {}
     ~ManagedType() { delete NativePtr; }

     void ManagedMethod()
      { NativePtr->NativeMethod(); } 
}; 

Sonra C # içinde, ManagedType derlemenize bir başvuru ekleyin ve şu şekilde kullanın:

ManagedType mt = new ManagedType();
mt.ManagedMethod();

Daha açıklanmış bir örnek için bu blog gönderisine göz atın .


2
blog yayını için bağlantı kopuk :(
Vidar

10

P / Invoke güzel bir teknolojidir ve hedef DLL dosyasını yüklemeyle ilgili sorunlar dışında oldukça iyi çalışır. İşleri yapmanın en iyi yolunun, yerel işlevlerden oluşan statik bir kitaplık oluşturmak ve bunu ona bağlı olan bir Yönetilen C ++ (veya C ++ / CLI) projesine bağlamak olduğunu bulduk.


Geri aramalar ve p / invoke ile ilgili sorunlar yaşadım. C ++ / CLI'ye geçiş bu sorunları giderdi.
MedicineMan

9

Bahsettiğiniz kütüphaneye aşina değilim, ancak genel olarak bunu yapmanın birkaç yolu var:

  • Dışa aktarılan kütüphane işlevlerine P / Çağır
  • COM tür kitaplığına bir başvuru ekleme (COM nesneleriyle ilgileniyorsanız).


2

Elbette. Bu makale , buna başlamak için yapabileceğiniz şeylerin güzel bir örneğidir.

Bunu Windows Mobile cihazlarımızda P / Invoke kullanarak C # üzerinden yapıyoruz .


2

Bunu yapmak için kullanılan teknolojiye P / Invoke denir ; konuyla ilgili makaleler arayabilirsiniz. C # 'dan C çağırmak için olduğuna dikkat edin, C ++' dan çok değil. Bu nedenle, C ++ kodunuzu DLL'nizin dışa aktardığı bir C sarmalayıcısına sarmanız gerekir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.