2008-11-06 9 views
9

Bir projeyi .NET 1.1'den .NET 2.0'a taşıdıktan sonra, MsBuild bazı COM nesneleri için çok fazla uyarı gönderir. Test içinCOM nesneleri ActiveDs veya MSXML2 başvurulan bir çok yapılandırma uyarısı

Örnek kod (gerçek kod, sadece uyarıları oluşturmak için kullanılan önemli değil):

using System; 
using System.DirectoryServices; 
using ActiveDs; 
namespace Test 
{ 
    public class Class1 
    { 
     public static void Main(string[] args) 
     { 
      string adsPath = String.Format("WinNT://{0}/{1}", args[0], args[1]); 
      DirectoryEntry localuser = new DirectoryEntry(adsPath); 
      IADsUser pUser = (IADsUser) localuser.NativeObject; 
      Console.WriteLine("User = {0}", pUser.ADsPath); 
     } 
    } 
} 

Uyarı mesajları

C benziyor: \ WINDOWS \ Microsoft.NET Framework \ \ v2.0.50727 \ Microsoft.Common.targets: uyarı: 'ITypeLib.RemoteGetLibAttr' argümanlarından en az biri çalışma zamanı çizelgesi tarafından ayarlanamaz. Bu tür argümanlar bu nedenle bir işaretçi olarak geçirilecek ve manipüle edilecek güvenli olmayan kod gerektirebilir.

Gözlemler:

  • Activeds (11 uyarılar) ve MSXML2 (54 uyarılar) için olur.
  • Kendi COM nesnelerine bakma. .Csproj dosyasında
  • <Reference> giriş Bütün uyarılara rağmen Özellik WrapperTool = "tlbimp"
  • içeren, sorun yok çalışan sistemde gözlenmiştir.

Uyarılardan nasıl kurtulacağına dair bir fikriniz var mı?

+0

Hiç bunu anlamaya başladınız mı? – Mario

+0

Maalesef, hayır. – gyrolf

cevap

6

MDSN article about TLBIMP for 2.0'daki bir yoruma göre, TLBIMP'i çalıştırarak bu sorunu kendiniz çözemezsiniz.

Sorununuzu VS kullanarak yeniden üretmek çok kolaydı.

tlbimp c:\WINNT\system32\activeds.tlb /out:interop.activeds.dll 

düzeltme

tlbimp c:\WINNT\system32\activeds.tlb /silent /out:interop.activeds.dll 

olarak MSDN makalesinde yorumunda işaret/Sessiz anahtarı, COM başvuru kullanmaktı: Ben de elle VS açıklama isteminden TlbImp çalışan çoğaltılamaz Kendiniz oluşturduğunuz birlikte çalışma derlemesine bir .net derleme başvurusu olur.

Ben VS uzman değilim ama projesinde bir Prebuild ekleyerek bu işi yaptı: Ben göz sekmesi bir başvuru eklemek için bir dll olurdu böylece

"$(DevEnvDir)\..\..\SDK\v2.0\bin\tlbimp" c:\WINNT\system32\activeds.tlb 
      /namespace:ActiveDs /silent /out:"$(ProjectDir)interop.activeds.dll" 

kez Dahili . Proje kökümdeki interop.activeds.dll dosyasına bir başvuru eklendi ve daha sonra yeniden oluşturuldu. Bunu bir başka yolla yapmak isteyebilirsiniz, örneğin bir C++ projesi ile harici bir make dosyası gibi. Bu daha çok bir POC.

MSBUILD vs VS'deki komik bir farka dikkat edin, $ (DevEnvDir) arka arkaya ters eğik çizgi var ama MSBUILD bunu yapmıyor.

Ben proje dosyasını düzenleyerek aynı sorunu yaşamış ve sabit vardı
-2

Sen birlikte uyarı durdurabilirsiniz:

uyarı listesi uyarı numaralarının virgülle ayrılmış listesidir
 
    #pragma warning disable warning-list 
    #pragma warning restore warning-list 

.

Uyarı, içe aktarmakta olduğunuz yazım denetiminin yönetilen kodda dönüştürülemez bir şey içerdiği, ancak işaretçi işlemlerini kullanarak güvenli olmayan bir kod bloğunda ele alınabileceği anlamına gelir. Kod, .Net 1.1'de de tercüme edilemedi, ancak derleyici, sizi uyardığı yöntemlerden birini kullanırsanız girebileceğiniz tuzak hakkında sizi uyaracak kadar akıllı değildi.

+2

Uyarı mesajı #pragma üzerinden devre dışı bırakıldı, çünkü uyarı mesajı uyarı numarası içermiyor! Uyarı, derleyici tarafından oluşturulmuyor. Muhtemelen TlbImp tarafından yaratılmıştır. – gyrolf

İlgili konular