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
cevap
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.]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
- 1. C++ empty std :: vektör,
- 2. sizeof() std :: vektör (C++)
- 3. C# delikleri ile sorun #
- 4. C# ile yüzdeleri kullanma
- 5. Cython ile C++ ve CUDA kodunu sarma
- 6. std :: vektör eki nasıl uygulanır? C++
- 7. C++ WinHttp/Windows SDK ile sorun derleme
- 8. C++ 11 std :: vektör eşzamanlı ortamda
- 9. C# Task.ContinueWith ile ilgili sorunlar
- 10. C# bölümü ile ilgili sorunlar #
- 11. C# ile vektör türünü nasıl alabilirim?
- 12. java'da FTPClient sınıfı ile ilgili sorun
- 13. Bağlantı ile ilgili sorun, C++ üye işlevi için C geri çağırma
- 14. Faset sayıları ile ilgili sorun
- 15. UITableViewCell'de AutoLayout ile ilgili sorun
- 16. Python'da .is_integer() ile ilgili sorun
- 17. C++ ile strateji kalıbını std :: function ile nasıl uygulanır
- 18. noweb ve LaTeX ile C veya C++ kodunu belgeleme
- 19. .bat menüsünde yol girdisi ile ilgili sorun
- 20. sqrtf undefined 'sqrtf' ile ilgili c
- 21. C++ Re'de C++ kodunu Kaçış
- 22. Varolan bir C projesinde Go kodunu kullanma
- 23. sıfırlara bir vektör başlatmak C++/C++ 11
- 24. Vektör simge, C++
- 25. C# 7 kodunu VSTS'ye aktarma
- 26. Vektörle ilgili bir sorun mu var? Bellek?
- 27. Authorize.Net ile Banka Hesaplarını Kullanma C# SDK
- 28. regex_match ile ilgili sorun nedir? Çok basit anlatım
- 29. Yerel html'i watir ile açma ile ilgili sorunlar
- 30. Action delegate C ile ilgili önemli bilgiler C#
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
Sarıcı sınıfları oluşturmak için C++/CLI kullanın. –
İ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