2008-11-06 7 views
9

किसी प्रोजेक्ट को .NET 1.1 से .NET 2.0 तक ले जाने के बाद, एमएसबिल्ड कुछ COM ऑब्जेक्ट्स के लिए बहुत सी चेतावनियां निकालती है। परीक्षण के लिएजब COM ऑब्जेक्ट्स ActiveDs या MSXML2 संदर्भित होते हैं तो बहुत सारी निर्माण चेतावनियां

नमूना कोड (वास्तविक कोड कोई फर्क नहीं पड़ता, बस चेतावनी बनाने के लिए इस्तेमाल):

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); 
     } 
    } 
} 

चेतावनी संदेश की तरह

सी लग रही है: \ WINDOWS \ Microsoft.NET \ फ्रेमवर्क \ v2.0.50727 \ Microsoft.Common.targets: चेतावनी: 'ITypeLib.RemoteGetLibAttr' के लिए तर्कों में से कम से कम एक रनटाइम मार्शलर द्वारा मार्शल नहीं किया जा सकता है। इसलिए इस तरह के तर्क एक सूचक के रूप में पारित किया जाएगा और असुरक्षित कोड की आवश्यकता हो सकती है।

टिप्पणियों:

  • ActiveDs (11 चेतावनी) और MSXML2 (54 चेतावनी) के लिए होता है।
  • हमारे अपने COM ऑब्जेक्ट्स के लिए नहीं देखा गया।
  • <Reference> .csproj फ़ाइल में प्रविष्टि विशेषता WrapperTool = "tlbimp"
  • सभी चेतावनियों के बावजूद, चल रहे सिस्टम में कोई समस्या नहीं देखी गई है।

कोई विचार चेतावनी से छुटकारा पाने के लिए कैसे?

+0

क्या आपने कभी इसे समझने का प्रबंधन किया था? – Mario

+0

दुर्भाग्य से, नहीं। – gyrolf

उत्तर

6

MDSN article about TLBIMP for 2.0 में एक टिप्पणी के मुताबिक, आप इस समस्या को ठीक नहीं कर सकते हैं w/o खुद को TLBIMP चलाना।

वीएस का उपयोग करके अपनी समस्या को पुन: उत्पन्न करना आसान था। मैं भी यह tlbimp चल मैन्युअल रूप से एक वी.एस. टिप्पणी शीघ्र से reproduced:

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

ठीक/मूक स्विच

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

के रूप में MSDN लेख में टिप्पणी में बताया, COM संदर्भ का उपयोग किया गया आपके द्वारा बनाए गए इंटरऑप असेंबली के लिए .NET असेंबली संदर्भ बन जाता है।

मैं एक वी.एस. विशेषज्ञ नहीं हूँ, लेकिन मैं की परियोजना के लिए एक prebuild जोड़कर इस काम किया:

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

यह एक बार निर्मित तो मैं ब्राउज़ टैब के साथ एक संदर्भ जोड़ने के लिए एक dll होगा । मेरे प्रोजेक्ट रूट में interop.activeds.dll के लिए एक संदर्भ जोड़ा गया और फिर फिर से बनाया गया। आप इसे किसी अन्य तरीके से करना चाह सकते हैं, जैसे सी ++ प्रोजेक्ट के माध्यम से बाहरी मेक फ़ाइल के साथ। यह एक पीओसी से अधिक है।

एमएसबीयूआईएलडी बनाम वीएस, $ (देवइन्दिर) में एक मजेदार अंतर नोट करें, पीछे की बैकस्लैश है लेकिन एमएसबीयूआईएलडी नहीं है।

-2

आप के साथ चेतावनियां रुक कर सकते हैं:

 
    #pragma warning disable warning-list 
    #pragma warning restore warning-list 

जहां चेतावनी सूची चेतावनी नंबर की एक अल्पविराम द्वारा अलग सूची है।

चेतावनी का अर्थ है कि आपके द्वारा आयात किए जाने वाले टाइपेलिब में प्रबंधित कोड में कुछ अप्रचलित है लेकिन असुरक्षित कोड ब्लॉक में पॉइंटर ऑपरेशंस का उपयोग करके निपटाया जा सकता है। यह कोड .Net 1.1 में भी अप्रचलित था, लेकिन संकलक आपको उस जाल के बारे में चेतावनी देने के लिए पर्याप्त स्मार्ट नहीं था जिसे आप चल सकते हैं यदि आप उन विधियों में से किसी एक का उपयोग करते हैं जो आपको चेतावनी दे रहा है।

+2

#pragma के माध्यम से चेतावनियों को अक्षम करना काम नहीं करता है क्योंकि चेतावनी संदेश में कोई चेतावनी संख्या नहीं है! चेतावनी संकलक द्वारा नहीं बनाई गई है। शायद यह TlbImp द्वारा बनाया गया है। – gyrolf

9

मैं संपादन प्रोजेक्ट फ़ाइल से एक ही समस्या का अनुभव था और तय यह (.csproj), यहाँ से एक सुझाव है:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/7a7c352b-20cb-4931-b3b5-27e899016f75/turning-off-msbuild-warnings-msb3305?forum=msbuild

मैं हर निर्माण की संपत्ति समूह के लिए निम्न कुंजी जोड़ा कॉन्फ़िगरेशन:

<ResolveComReferenceSilent>True</ResolveComReferenceSilent> 
+1

शानदार, यह TLBIMP का उपयोग किए बिना काम किया। –

संबंधित मुद्दे