2012-04-04 32 views
5

Temel olarak C# (hizmetler, çoklu okuma vb.) Ile yazılmış büyük bir projemiz var. Ancak, çekirdek sayısı çatlama algoritmaları, hızlı olmak için (OpenMP vb.) Yönetilmeyen C++ 'da yazılmıştır. Ne yazık ki şu anda bu iki dünya arasında veri alışverişi yapmak için çok çaba sarf etmemiz gerekiyor. Örneğin, C++ sınıflarının her biri için C++/CLI'ye sarma sınıfları yazmamız gerekiyor. C# - "dünyasında" (sanal olarak) istenen herhangi bir ayar (Özellikler) için C++ dünyasında bir kopya (bir başlık dosyası) ve sarmalayıcı sınıfında ileri ve geri dönüşüm vardır. Bu mimari çok verimsiz ve oldukça hataya eğilimli görünüyor.Yönetilmeyen C++ kodunda C# özelliklerini kullanma

Birincil soru: Bir C# sınıfının özelliklerini yönetilmeyen C++ otomatik olarak bir şekilde paylaşmanın bir yolu var mı? (okuyup yazmamız gerekiyor!)

İkincil soru: Yukarıda açıklandığı gibi bir durumda mimarinin nasıl geliştirileceğine dair herhangi bir tavsiyede bulunabilir misiniz? Bizim bir düşüncemiz tamamen C++ 'ya geçmekti, ancak uygun kütüphaneleri bulmak ve NET'te yaptığımız tüm (sistem-) şeyler için temiz kod yazmak şu an iyi hissetmiyor. Yardımlarınız ve saygılarımla, Jakob için

çok teşekkürler

benim birincil görevi belli yüksek performanslarının, düşük gecikme DLL dosyaları için yönetilen arayüzleri yazmak için benim iş yerinde benzer sorunlarla uğraşıyorum
+0

C# 'daki algoritmaları yazmanın bir darboğaz olduğunu doğruladınız mı? C# 4.0 şimdi paralel geliştirme için iyi bir destek var. – Nick

+0

Hayır, bunu henüz yapmadık ve siz haklısınız: Bu noktadan emin olmaya çalışmalıyız. Ancak, belleğin önbelleğe alınması ve benzerlerinin özelliklerine bağlı olduğumuzdan, algoritmanın CLR'de benzer hızda çalışacağından şüpheliyim. –

+2

[Protokol Tamponları] (http://code.google.com/p/protobuf/) nasıl olur? C# ile [protobuf-net] (http://code.google.com/p/protobuf-net/) kullanarak birlikte kullanma yeteneği vardır. – megabyte1024

cevap

1

, bu basit davaları kapsar yerel sınıflara yerel cihaza bir ham işaretçi içeren basit C++/cli kullanarak veya yerel kodun bir sunucu tarafı yayıncısı olduğu ve yönetilen kodun temsilcilerle abone olmak zorunda olduğu daha karmaşık konular kullanarak yerel sınıfları sarmak zorunda olduğum doğal geri aramalara dönüştürüldü. .NET başlık altında .NET, bildiğim kadarıyla gelişmiş bir COM sunucusudur. ComVisible özniteliği true olarak ayarlanmış .net meclisleri yazmak mümkündür, daha sonra klasik bir COM bileşeni olarak davranır ve daha sonra bir COM bileşeni olarak yerel C++ kodundan kullanmak mümkündür. Yönetilen yerel kodu kullanmak için tersi, DllImport özniteliklerini kullanarak elde edilebilir ve tüm Marshaling StructLayoutAttribute (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx) ve MarshalAsAttribute (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.aspx) gibi çeşitli öznitelikler tarafından ince ayarlanmış da bazen güvensiz anahtar sözcük kullanıyorum de. Yüksek performanslı kodlarla uğraşmak zorundayım, bu yüzden bazı durumlarda profilden sonra en iyi çözümün hangisi olduğunu biliyorum. Bahsettiğiniz veya klasik COM yolu ya da bazı önbelleğe alma, nesne havuzu vb. Ile bir tür hibrit, bu tür bir çözücü sınıfı çözümü olsun.

Yardım edin.

Bu biraz bozuk gözüküyorsa özür dileriz. Burası çok geç. :)

+0

Cevabınız için teşekkürler - Marhsal.StructToPtr ve yardımcılarını kullanarak sarıcı kodumuzu çoktan temizledim ve C++/CLI bileşenlerini hem C# hem de yerel C++ dünyasında kullanarak daha da geliştirmeyi umuyoruz. –

+0

Teşekkür ederiz Jakob S. – ervinbosenbacher

İlgili konular