2010-06-10 27 views
29

C++ dilinde yazılmış bir kitaplık geçirme sürecinde ve bir C# sarıcısına sahip oluyorum. C# sarıcı (LibWrapper) gibi ad ile sınıfları kümesi vardır:İki adede aynı adla sınıf (kasıtlı olarak)

namespace MyNamespace 
    class MyClass 
    class MyOtherClass 

Benim yeni kütüphane, LibraryCS (kullanıcı şartının) LibWrapper aynı ad alanları ve sınıf adlarını içeren, bu yüzden de vardır:

Bu geçiş yapıldıktan sonra, geçişi doğrulamak için her iki kütüphaneyi kullanma sonuçlarını karşılaştıran bir test oluşturma aşamasındayım. Ancak, ben MyNamespace.MyClass başvurmaya çalıştığınızda "MyNamespace.MyClass hem LibWrapper hem de LibraryCS içinde tanımlanır" yazan bir derleyici hatası (beklenen!) Alıyorum.

Bu sorunun çevresinde herhangi bir hile var mı, bu aynı adla iki sınıf kullanmamıza izin verecek, ancak aynı istemci kodundaki farklı derlemeler kullanılmasına izin verecek?

Alternatif olarak, bunu test etmenin başka bir yolu var mı?

Taşınan ad alanını MyNamespace2 gibi bir şeye yeniden adlandırma elbette işe yarayacak, ancak istemcinin kodunun taşınmasını kolaylaştırmak için bunu yapmamamız isteniyordu.

+0

Başka bir ad alanında varolan sınıflardan birinin etrafına bir sarıcı yazmak iyi olur mu? – Goblin

+0

Her ikisini de aynı test kodunda çalıştırabilirsem, kabul edilebilir. Sadece test amaçlı kullanılan bir ambalaj olacaktır. – pgb

cevap

54

Farklı meclisleri aynı tam adıyla türlerini başvurmak için bir extern alias kullanabilirsiniz. LibraryCS'ye başvuruyu seçin ve özellikler sayfasındaki "global" ile "LibraryCS" arasında Aliases'i güncelleyin ve kaynak dosyanızın üstüne extern alias LibraryCS; ekleyin ve sonra LibraryCS'deki sınıfa başvurmak için LibraryCS::MyNamespace.MyClass'u kullanabilirsiniz. LibWrapper'daki sınıfa başvurmak için MyNamespace.MyClass veya global::MyNamespace.MyClass öğelerini kullanabilir veya bu referans için de bir takma ad kullanabilirsiniz.

+4

Quartermeister ile aynı fikirdeyim. Daha fazla referans için aşağıya bakın: http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx – Kari

4

Bu sınıfların her ikisini de aynı yürütülebilir dosyaya yüklemek için, bunları ayrı bir Uygulama Etki Alanı içine yükleyebilirsiniz. Bu, montajı test etmenize izin verir, daha sonra tamamen boşaltın ve ikincisini yükleyin ve test edin.

Bunun nasıl yapılacağı hakkında ayrıntılar için bkz. How to: Load Assemblies into an Application Domain ve Unload an Application Domain.

0

İlk montajı çalışma zamanında yükleyebilir, ardından yansıtmayı kullanarak yansıtmayı kullanarak bu yöntemi uygulayabilirsiniz. Daha sonra bu tertibatı boşaltın, ikinci tertibatı yükleyin ve onu oluşturmak ve yöntemlerini çalıştırmak için yansımayı kullanın.

Muhtemelen daha sonra ortaya çıkan çıktıyı karşılaştırmak 2 ayrı işlemler kullanmak kolaydır diye ...

+1

Bir derlemeyi doğrudan yükleyemezsiniz, yalnızca bir AppDomain. Bunu yapmak için, bu derlemeyle ayrı bir uygulama alanına ihtiyacınız vardır. –

+0

İyi çağrı, derlemeyi kaldırmak için AppDomain'i aşağı çekmek zorunda kalacaktı, cevabı düzenleyeceğim. –

1

Bu soru ve cevapları gördüm ve bana yardımcı oldu. Aynı zamanda detaylı bir açıklamaya ihtiyaç duyanlar için, gerçekten yararlı olan bir link buldum.

Bağlantıdan çıkarın. VS IDE kullanılarak: tek bir uygulama

aşama 1 'de aynı DLL farklı sürümleri kullanılarak

. Referansı, hem istemci uygulama çözümünüzdeki dll'ye ekleyin. Daha sonra, Referans düğümü altındaki Çözüm Gezgini'nde ilk (eski sürüm) sınıf kitaplığını seçin.Özellik penceresinde, Aliases alanını global'dan oldVer'a değiştirin. N ewer versiyon için newVer.

Adım 2: Eğer

extern alias oldVer; 
extern alias newVer; 

artık kullanıma referans planladığınız ilk ifadeleri olarak aşağıdaki kodu kullanabilirsiniz, bu yardımcı olur

Console.WriteLine(oldVer::MyLibrary.MyClass.method()); 
Console.WriteLine(newVer::MyLibrary.MyClass.method()); 

Umut.

İlgili konular