2011-09-18 11 views
9

हम एक सी # अनुप्रयोग विकसित कर रहे हैं जो कुछ COM पुस्तकालयों (उदाहरण के लिए ऑटोआईटी) का संदर्भ देता है।बिल्ड सर्वर पर COM संदर्भित DLL को पंजीकृत करना

मैं तीसरे पक्ष के "लिब्स" फ़ोल्डर में स्रोत नियंत्रण के तहत सभी संदर्भित घटक शामिल कर रहा हूं।

समस्या यह है कि COM dll के पास .csproj फ़ाइल में हिंटपाथ प्रॉपर्टी नहीं है, और मुझे लगता है कि इन्हें regsvr32 (या किसी प्रकार की स्क्रिप्ट का उपयोग करके मैन्युअल रूप से पंजीकृत होना चाहिए)।

मैं वर्तमान में एक एमएसबील्ड स्क्रिप्ट बनाने की तलाश में हूं जो हर निर्माण से पहले चलाएगा, हालांकि मुझे पता नहीं लगा कि मुझे मैन्युअल रूप से regsvr32.exe को कॉल करना चाहिए या कुछ पूर्वनिर्धारित एमएसबिल्ड कार्य का उपयोग करना चाहिए?

वर्तमान में, यह है कि क्या मैं एक परीक्षण के रूप attmpted है:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build"> 
    <ItemGroup> 
    <MyAssemblies Include="D:\*.dll" /> 
    </ItemGroup> 
    <Target Name="Build"> 
    <RegisterAssembly 
     Assemblies="@(MyAssemblies)" > 
    </RegisterAssembly> 
    </Target> 
</Project> 

यह त्रुटियों कि DLLs मैं दिए गए फ़ोल्डर में रखा गया है वैध DLLs नहीं हैं उत्पन्न करता है।

इस समस्या के लिए एक अच्छा समाधान क्या है?

संपादित करें:

परियोजनाओं का संदर्भ COM DLLs .csproj फ़ाइल में इस के समान कुछ है:,

<COMReference Include="AutoItX3Lib"> 
     <Guid>{F8937E53-D444-4E71-9275-35B64210CC3B}</Guid> 
     <VersionMajor>1</VersionMajor> 
     <VersionMinor>0</VersionMinor> 
     <Lcid>0</Lcid> 
     <WrapperTool>tlbimp</WrapperTool> 
     <Isolated>False</Isolated> 
    </COMReference> 

यह अन्य कामयाब विधानसभाओं के रूप में किसी भी संकेत पथ शामिल नहीं है एक निर्माण सर्वर पर इतना , संदर्भित COM डीएल नहीं मिला है।

REGSVR32 का उपयोग कर बिल्ड सर्वर पर COM dll को पंजीकृत करते समय, निर्माण सफल होता है।

उत्तर

10

आप बिल्ड सर्वर पर COM सर्वर पंजीकृत नहीं करते हैं। यह केवल तब आवश्यक है जब आप वास्तव में संकलित कोड चलाएं। आपको COM सर्वर के लिए प्रकार पुस्तकालयों की आवश्यकता है ताकि आप इंटरऑप असेंबली प्राप्त कर सकें। जो आप Tlbimp.exe के साथ बनाते हैं।

चाहे आप बिल्ड सर्वर पर Tlbimp को चलाने या एक देव मशीन पर आगे बढ़ाना चाहते हैं, इस पर आप इन COM सर्वरों को कैसे तैनात करते हैं, इस पर एक बड़ा सौदा निर्भर करता है। आपके इंटरऑप पुस्तकालयों के बहुत करीब COM निष्पादन योग्य और .tlb फ़ाइलों की एक प्रति रखना एक अच्छा विचार है। दूसरे शब्दों में, इन्हें जांचें।इंस्टॉलर अब COM सर्वर के ज्ञात-अच्छे संस्करण को भी पुनर्प्राप्त कर सकता है।

+0

मेरे पास दोनों प्रकार के पुस्तकालय और इंटरऑप असेंबली दोनों मेरे स्रोत नियंत्रण (गिट) में चेक किए गए हैं। इंटरऑप का संदर्भ देना पर्याप्त नहीं है। Tlbimp का उत्पादन क्या है? मैं इसे आगे की बजाय निर्माण प्रक्रिया के हिस्से के रूप में करता हूं, जब बिल्ड एनवी को अपग्रेड करते समय, मैं बस सभी स्क्रिप्ट को कॉपी कर सकता हूं और अधिक सर्वरों में विस्तार कर सकता हूं और बिना किसी पूर्व चरण –

+0

के साथ संग्रहीत सभी तर्क प्राप्त कर रहा हूं Tlbimp का आउटपुट है इंटरऑप असेंबली। मैं "पर्याप्त नहीं है" के साथ कुछ भी नहीं कर सकता, आपको उस बेहतर त्रुटि का वर्णन करना होगा जो आपको बेहतर हो। –

+0

मैंने अपना मूल प्रश्न अपडेट किया है। इंटरऑप डीएल "निर्भरता" फ़ोल्डर में मौजूद है, हालांकि .csproj और इस फ़ाइल के बीच कोई लिंक नहीं है, इसलिए बिल्ड इस फ़ाइल को नहीं उठा रहा है। मेरे देव envinronment पर, यह ठीक काम करता है क्योंकि मेरे पास मूल सॉफ्टवेयर पैकेज स्थापित है (उदाहरण के लिए ऑटोआईटी), हालांकि बिल्ड सर्वर पर यह स्थापित नहीं है और इसलिए निर्माण संकलन से पहले कुछ अतिरिक्त कदम किए बिना विफल रहता है .. –

0

1) COM cibrroj को संदर्भ के रूप में COM पुस्तकालयों को संदर्भित करने का प्रयास करें - यदि आपने ऐसा नहीं किया है।

2) अपने csproj फ़ाइल में जोड़ने के लिए प्रयास करें:

<Project ... > 
    ... 
    <Target Name="BeforeBuild"> 
     <Exec Command="regsvr32.exe yourComponent.dll" /> 
    </Target> 
</Project> 

पुनश्च: यदि आप निर्माण सर्वर सॉफ्टवेयर के कुछ प्रकार का उपयोग कर रहे आप csproj लेकिन सर्वर पर निर्माण द्वारा इस्तेमाल किया स्क्रिप्ट को संशोधित नहीं करना चाहिए।

+0

उत्तर के लिए धन्यवाद। मैं .csproj फ़ाइलों को परिवर्तित नहीं करना पसंद करता हूं, बल्कि इस काम को करने के लिए एक "prep" स्क्रिप्ट है। मैं सभी असेंबली पर regsvr32.exe को चलाने के लिए चाहता हूं (शायद एक ही फ़ोल्डर के तहत सभी COM संदर्भ रखें और इसे चलाएं)। हालांकि मैं उन सभी को एमएसबिल्ड में एक-एक करके कैसे दोहरा सकता हूं। –

+0

मेरा मानना ​​है कि मुझे समाधान मिला -% (MyAssemblies.Identity) नोटेशन का उपयोग * .dll का उपयोग करते समय विस्तारित फ़ाइलों में से प्रत्येक एक बार आदेश चलाएगा। क्या यह सही और सामान्य उपयोग है? –

+0

मैं वास्तव में आपको% (MyAssemblies.Identity) के साथ समाधान नहीं समझता क्योंकि आप COM dlls का उपयोग करने का प्रयास कर रहे हैं। लेकिन सूची फ़ाइलों के माध्यम से पुन: प्रयास करने के लिए आप कमांड लाइन में 'for' का उपयोग कर सकते हैं यदि आप चाहें: इसका उपयोग कैसे करें इसका पता लगाने के लिए - बस 'के लिए' टाइप करें? > yourTargetPath \ help_for_for.txt 'और बनाई गई txt फ़ाइल को पढ़ें। –

0

मुझे यकीन नहीं है, अगर MSBuild में regsvr32 को कॉल करने के लिए कोई कार्य है, लेकिन REGisterAssembly regasm.exe को कॉल कर रहा है - वह है - COM इंटरऑप के लिए .NET घटक पंजीकृत करना।

मुझे यकीन है कि, केवल regsvr32 को कॉल करना वांछित परिणाम प्राप्त करने का सबसे तेज़ तरीका होगा।

एक और बात यह है कि क्या होगा यदि COM DLL पहले से ही पिछले निर्माण द्वारा पंजीकृत हैं और आप अपनी बिल्ड स्क्रिप्ट फिर से चलाएंगे? (मुझे वास्तव में पता नहीं है कि regsvr32 कैसे प्रतिक्रिया करेगा, सिर्फ एक विचार)

+0

कॉलिंग regsvr32 फिर से बर्बाद एक्स मिलीसेकंड को छोड़कर हानिरहित (AFAIK) है। –

11

के लिए एक ऐसी ही सवाल करने के लिए अपने मूल जवाब देखें: TFS Build server and COM references - does this work?

निर्माण सर्वर के लिए एक बेहतर विकल्प अपनी परियोजना के बजाय फ़ाइल COMReference में COMFileReference आइटम का उपयोग करने के लिए हो सकता है। एक उदाहरण इस प्रकार दिखाई देगा:

<ItemGroup> 
    <COMFileReference Include="MyComLibrary.dll"> 
    <EmbedInteropTypes>True</EmbedInteropTypes> 
    </COMFileReference> 
</ItemGroup> 

COM dll इस काम करने के लिए मशीन पर पंजीकृत करने की आवश्यकता नहीं है।

प्रत्येक COMFileReference आइटम में एक WrapperTool विशेषता भी हो सकती है लेकिन डिफ़ॉल्ट ठीक काम करता प्रतीत होता है। ClickInteropTypes विशेषता को COMFileReference पर लागू होने के रूप में प्रलेखित नहीं किया गया है, लेकिन ऐसा लगता है कि यह इरादे से काम करता है।

थोड़ा और विस्तार के लिए http://msdn.microsoft.com/en-us/library/bb629388.aspx देखें। यह एमएसबिल्ड आइटम .NET 3.5 के बाद से उपलब्ध है।

+0

बीटीडब्लू, ऐसा प्रतीत होता है कि हिंटपाथ COMReference कार्य के लिए भी काम करता है, भले ही यह दस्तावेज न हो। – jpierson

+0

HintPath COMReference में मेरे लिए काम नहीं किया था, लेकिन मैं COMFileReference के शामिल विशेषता में पथ का उपयोग कर सकता था। – kristianp

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