2011-02-07 20 views
5

Yerel C++ işlevlerimi yönetilen C# kodundaki dll'den kullanmak istiyorum. Ancak işlevlerim std :: vector & - vektör referansı gibi argümanları alır. Bu argümanı dllimport deyiminde nasıl uygulayabilirim? Örneğin, IntPtr ve bunun gibi bir şey olduğunu biliyorum ama std :: vector <> için ne olacak?Yerel C++ kodunu C# ile kullanma - std ile ilgili sorun :: vektör

+1

Bu muhtemelen çok zor, imkansız olmasa da olur. C++ 'kütüphaneniz için bir' C' arayüzü sağlayabilir ve bunun yerine kullanabilir misiniz? – ereOn

+2

Sarıcı sınıfları oluşturmak için C++/CLI kullanın. –

+1

İhtiyacınıza benzer bir şey elde etmek için sulandırılmış çözümleri kullanabilmenize rağmen, doğru bir şekilde anladıysam, yönetilmeyen dll'nin ve yönetilen uygulamanın kodunu denetlersiniz.Bu durumda, dll'deki işlevleriniz için C++/CLI sarmalayıcıları sağlamak daha iyidir ve bunları doğrudan C# olarak adlandırın. Belki de STL.Net'e bir göz atmalısın. Burada bir primerin bağlantısı: http://msdn.microsoft.com/en-us/library/ms379600%28v=vs.80%29.aspx – ds27680

cevap

5

Gerekli işlevleri sarmak için "C" işlevlerini ve C/C# 'den onları çağırır. Böyle bir "C" işlevi std::vector<> verilerini bir işaretçi ve veri arabelleğinin boyutu olarak gösterebilir. Bir sınıfa Buffer bir std::vector<byte_t> var mesela

ki:

class Buffer 
{ 
public: 
    const std::vector<byte_t>& GetData() const { return data_; } 

private: 
    std::vector<byte_t> data_; 
}; 

Sonra bir "C" fonksiyonunu düzgün kapsamı aktarabilir Buffer kullanmak istediğiniz:

Buffer* CreateBuffer(); 

Ve muhtemelen std::vector<byte_t>'u dolduran yerel tarafta bir şey yapmak istersiniz:

void DoSomethingThatProduceData(Buffer* buffer); 

Sonra bu verileri okuyabilir:

void GetBufferData(const Buffer* buffer, const byte_t** data, int* size); 

Ve son olarak, temizlemek:

void DestroyBuffer(Buffer* buffer); 

/P bu "C" bildirimleri Çevir C# tarafında olanları çağırmak:

[DllImport("YourBufferLib.dll")] 
static extern IntPtr CreateBuffer(); 

[DllImport("YourBufferLib.dll")] 
static extern void DoSomethingThatProduceData(IntPtr buffer); 

[DllImport("YourBufferLib.dll")] 
static extern void GetBufferData(IntPtr buffer, out IntPtr data, out Int32 size); 

[DllImport("YourBufferLib.dll")] 
static extern void DestroyBuffer(IntPtr buffer); 

Bu çağrıları yönetilen tarafa, yerel kaynağın düzgün bir şekilde doğru olmasını sağlayan bir IDisposable sınıfında sarmak A Good Thing olurdu. eğildi.

[gerçekleşen, bir miktar önemsiz "C" işlevleri uygulama detayları açıkça okuyucuya bir örnek olarak bırakılır.]

0

STL vektörleri yönetilmeyen şablonu yöntemlerdir. Teoride, ofsetleri, ilgili vektör yöntemlerine hesaplayabilir ve bazı kod üretimlerini gerçekleştirebilirsiniz. Dll vektörünü kullanamazsınız çünkü STL vektörleri yalnızca dışa aktarılmayan yöntemler olan bir şablon kütüphanesidir. Elbette

int GetSize(vector<xxx> *vec) 
{ 
    return vec.size(); 
} 

gibi belirli yöntemleri çağırmak için bir C tarzı sarmalayıcı yazabilirim Ama bunun için gerekli birçok yönetilen unmanged geçişler ani durma noktasına başvurunuzu getirecektir çünkü bunu yapmak istemiyorum. Stl vektörlerini manipüle etmeniz gerekiyorsa, en iyi bahis, yönetilen C++ 'yı kullanmak ve C#' yı kullanarak, vektörleri istediğiniz gibi değiştirmek için Yönetilen C++ dll'inize çağırmaktır. Birçok şirkette Yönetilen C++ 'nın kullanımı yasaklandı, çünkü C++' nun ana varlığını kaybetmesine neden olan yönetilmeyen yönetilen geçişlerin maliyetine dikkat edilmedi: Hız.

Sevgiler, Alois Kraus