2016-02-12 9 views
7

Bu 'un numaralı kopyasının this question kopyası olabileceğini unutmayın, emin değilim.Kod sözleşmesi, 'Üye başvurusu çözülemedi' ile yeniden başarısız oldu

Sorunum, bir üçüncü taraf kitaplığı (COM) başvurusu olan bir sınıf kitaplığı projem var.

public class foo 
{ 
    public static int divide(TypeFromTypeLib tftl, int a, int b) 
    { 
     Contract.Requires<ArgumentException>(b != 0); 
     return a/b; 
    } 
} 

Ve sonra bir istemci projesi var bu yöntemin, örneğin faydalanmak: Öyle gibi, sınıf kitaplığında yöntemlerle içine sözleşmeleri koymak istiyorum

var n = foo.divide(null, 4, 2); 

Ama aynı zamanda istemci projesi gibi aynı zamanda yöntemlerin bazılarında sözleşmeler kullanmayı tercih ediyorum. Bu nedenle, her iki projede de Kod Sözleşmeleri özelliklerini 'Çalışma Zamanı Sözleşme Denetimi Gerçekleştir' olarak ayarlıyorum (çalışma zamanını bu ayarlara gereksinim duyduğunuzu bildiren bir sürüm almanıza gerek kalmadan).

Şimdi, o zaman müşteri derlemeye çalıştığınızda, aşağıdaki hatayı alıyorum :

Could not resolve member reference: my_class_lib.foo::divide.

ccrewrite : error : Rewrite aborted due to metadata errors.

kaçınılmaz görünüyor - Üçüncü şahıs tipi kütüphanesinden bir türü olan bir yöntemi denir her zaman bu olmuyor . Türü, yöntem imzasından kaldırın ve sorun değil.

Bunun nedenini açıklayan herkes var mı? Bu, kodumun yapısının temel olarak kusurlu olduğuna dair bir ipucu mu (eğer öyleyse, neden?), Yoksa kod sözleşmelerinin bir tuhaflığı mıdır? Bu sorun için önerilen bir düzeltme var mı?

+0

Bu hatayı, ccrewrite'den, imzalarında birlikte çalışma türleri gömülü olan bir birinci taraf kitaplığındaki yöntemlerden alıyorum. – JamesFaix

+0

Projemi VS2015'te açtım ve VS2013'e geçtim ve sorun ortadan kalktı. Roslyn derleyicisi, gömülü birlikte çalışma türlerini eski derleyiciden farklı bir şekilde ele alıyor gibi görünüyor, ancak bu konuda herhangi bir belge veya konuşma bulamıyorum. Muhtemelen ilgili: http://stackoverflow.com/questions/35641972/why-does-visual-studio-2015-throw-more-cs1769-compiler-errors-than-vs2013 – JamesFaix

+0

Kod sözleşmelerinin hangi sürümlerini yüklediniz? 26 Ocak 2016'da v.1.10.10126.2-rc1 sürümüne kadar, Visual Studio 2015'te çalışan kod sözleşmelerinin çalışma zamanı denetimini hiç yapmadım. Bu sürüm, kod sözleşmelerinin ilk büyük topluluk güdümlü sürümleridir ve çok adreslidir. bekleyen sorunlar. Şuradan indirilebilir: https://github.com/Microsoft/CodeContracts/releases. Kurdum ve çalışma zamanı kontrolü şimdi tekrar benim için çalışıyor. –

cevap

2

Dürüst olmak gerekirse ccrewrite birlikte çalışma türleri ile bir sorunu var neden bilmiyorum ama size 3 geçici çözümler verebilir:

Çözüm 1

Bu seferki en basit olanıdır:

  • Bir projenin referansları listesine gidin.
  • Üçüncü taraf kitaplığı bulun.
  • Sağ tıklatınız.
  • Bağlam menüsünden, Özellikler'u seçin.
  • Değiştir Tümleşik Türler dan True to False.

Her iki proje için bunu yapmak zorundasınız. Bu çözümün dezavantajı, bir derlemeden sonra, bin klasöründe ek bir birleştirme düzeneği alacağınızdır.

Başka bir çözüm, bir kamu arayüz yani bir üçüncü taraf tür kitaplığından türlerini kaldırmak için olabilir 2

Çözüm: değil mi sadece bunu yapabilir Tabii

public class foo 
{ 
    public static int divide(int a, int b) 
    { 
     return divide(null, a, b); 
    } 

    private static int divide(TypeFromTypeLib tftl, int a, int b) 
    { 
     Contract.Requires<ArgumentException>(b != 0); 
     return a/b; 
    } 
} 

istemcinizde TypeFromTypeLib kullanmanız gerekir.

Çözüm 3

Eğer bu sınıf yani için bir sarıcı yazabilirsiniz .: İstemcinizdeki TypeFromTypeLib kullanmanız gerekirse ek sınıflar ihtiyaç vardır çünkü

public class MyTypeFromTypeLib 
{ 
    //... 
} 

public class foo 
{ 
    public static int divide(MyTypeFromTypeLib mytftl, int a, int b) 
    { 
     var tftl = new TypeFromTypeLib(); 
     //Map MyTypeFromTypeLib to TypeFromTypeLib 
     //... 
     return divide(tftl , a, b); 
    } 

    private static int divide(TypeFromTypeLib tftl, int a, int b) 
    { 
     Contract.Requires<ArgumentException>(b != 0); 
     return a/b; 
    } 
} 

Ancak bu çözüm hantal.

İlgili konular