2012-03-06 14 views
12

क्या डॉटनेट इंटरऑप और सी # के साथ पंजीकरण मुक्त COM का उपयोग करना संभव है? यदि ऐसा है तो सी # प्रोजेक्ट में COM ऑब्जेक्ट का संदर्भ कैसे जोड़ता है?सी # के साथ रेग फ्री COM इंटरऑप, संभव है?

मेरे पास एक एम्बेडेड मेनिफेस्ट और दो टेस्ट क्लाइंट्स के साथ एक रेग फ्री एटीएल COM सर्वर डीएल है, एक सीपीपी अन्य सी #। सीपीपी ग्राहक को सही ढंग से संदर्भित करती एक आयात बयान और या तो

#pragma comment(linker, "\"/manifestdependency:type='win32' name='TestComSvr2' version='1.0.0.0'\"") 

या सेटिंग 'अतिरिक्त प्रकट निर्भरता' के लिए प्रयोग कर COM ऑब्जेक्ट "type = 'Win32' name = 'TestComSvr1' संस्करण = '1.0.0.0'" लिंकर के तहत -> मैनिफेस्ट फ़ाइल विकल्प, जिसके बाद सीपीपी क्लाइंट ठीक से चलेंगे, जब तक COM घटक एक ही निर्देशिका में है।

सी # क्लाइंट हालांकि बिल्कुल खेलने से इंकार कर देता है।

या तो अपंजीकृत COM घटक dll या त्रुटि में अपंजीकृत tlb परिणाम के लिए एक फ़ाइल संदर्भ जोड़ने के लिए प्रयास कर रहा है:

"A reference to 'blah blah' could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component".

'regtlib TestComSvr' के साथ बस प्रकार लायब्रेरी का पंजीयन करने और फिर एक फ़ाइल या बनाने कॉम कि के संदर्भ में सी # परियोजना में जो परिणाम के साथ निर्माण करने में नाकाम रहने:, पृथक करने के लिए संदर्भ की स्थापना, सी # परियोजना तो निर्माण पंजीकरण रद्द

"Error loading type library/Dll. (Exception from HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))".

COM घटक का पंजीयन और ग # परियोजना में सामान्य रूप से एक संदर्भ बनाने घटक और इस अपवाद में सी # परियोजना परिणाम चल:

Retrieving the COM class factory for component with CLSID {B1D0A80F-0050-4856-BACD-87D664E58CBE} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

नोट: भले ही यह काम किया यह एक उपयोगी मामले वैसे भी नहीं होगा, क्योंकि अंतत: यह अभी भी घटक के पंजीकरण की आवश्यकता है, मैं सिर्फ यह के लिए परीक्षण किया पूर्णता।

अभी तक एकमात्र तरीका मैं सी # से COM ऑब्जेक्ट को संदर्भित करने में सक्षम हूं, COM ऑब्जेक्ट को स्वयं पंजीकृत कर रहा है, जो निश्चित रूप से बिंदु को पूरी तरह से हरा देता है, तब से यह बिल्कुल मुक्त नहीं होता है।

किसी को भी कोई विचार है?

(यह वीएस 2010 एसपी 1 के साथ विनएक्सपी पर है)।

+0

आश्चर्य है कि क्या आपको दृश्य स्टूडियो exe के लिए एक मेनिफेस्ट फ़ाइल बनाने की आवश्यकता होगी? यह लिंक मिला, लेकिन यह सुनिश्चित नहीं है कि यह सब उपयोगी है http://msdn.microsoft.com/en-us/library/ms973913.aspx – PeskyGnat

+2

इसके अलावा, यदि आप tlbimp के साथ एक इंटरऑप डीएल बनाते हैं और संदर्भित करते हैं तो क्या होगा? यानी 'tlbimp ' के साथ? – PeskyGnat

उत्तर

12

आप की जरूरत है:


  1. आप अपने पंजीकरण से मुक्त कॉम विधानसभा प्रकट है, जहां आप न्यूट्रिनो पर अपने dependancy राज्य के साथ आने की जरूरत है।TestComSvr2 ​​ विधानसभा:

    <?xml version="1.0" encoding="utf-8"?> 
    <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" 
          xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" 
          xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    
        <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> 
    
        <!-- We depend on our COM object --> 
        <dependency> 
         <dependentAssembly> 
          <assemblyIdentity type="win32" name="Neutrino.TestComSvr2" version="1.0.0.0" /> 
         </dependentAssembly> 
        </dependency> 
    
    
        <!-- 
         Everything else in this sample manifest is not relavent to this answer, 
         but every developer should be doing their job and writing correct 
         Windows programs 
        --> 
    
        <!-- Disable file and registry virtualization. --> 
        <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
         <security> 
         <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
          <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
         </requestedPrivileges> 
         </security> 
        </trustInfo> 
    
        <!-- We are high-dpi aware on Windows Vista --> 
        <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> 
         <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
         <dpiAware>true</dpiAware> 
         </asmv3:windowsSettings> 
        </asmv3:application> 
    
        <!-- Declare that we were designed and tested on Windows 7--> 
        <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
         <application> 
          <!--The ID below indicates application support for Windows 7 --> 
          <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> 
          <!--The ID below indicates application support for Windows Vista --> 
          <!-- supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/ --> 
         </application> 
        </compatibility> 
    
        <!-- We depend on Common Controls version 6 (i.e. "enable themes") --> 
        <dependency> 
         <dependentAssembly> 
         <assemblyIdentity 
           type="win32" 
           name="Microsoft.Windows.Common-Controls" 
           version="6.0.0.0" 
           processorArchitecture="*" 
           publicKeyToken="6595b64144ccf1df" 
           language="*" 
         /> 
         </dependentAssembly> 
        </dependency> 
    

    नोट: मैं अपने सवाल में एक ऐसी ही प्रकट किया था Registration-Free COM from ASP.NET?

  2. तो फिर तुम इस आवेदन अपने सी # exe में प्रकट शामिल करने की जरूरत:

    1. समाधान एक्सप्लोरर में प्रोजेक्ट पर राइट-क्लिक करें।
    2. पर क्लिक करें "नया आइटम जोड़ें"
    3. "एप्लिकेशन मैनिफेस्ट फ़ाइल" का चयन करें।

ये कदम adding a manifest to a managed application के लिए MSDN पर पाया जा सकता है क्या के समान हैं।

तुम भी सुनिश्चित करें कि आपके Neutrino.TestComSvr2 ​​ विधानसभा में शामिल है यह पंजीकरण से मुक्त कॉम प्रविष्टियों है की जरूरत है:

Neutrino.TestComSvr2.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 

    <assemblyIdentity type="win32" name="Neutrino.TestComSvr2" version="1.0.0.0" /> 

    <file name = "ContosoFrobber.dll"> 

     <comClass 
      progid="Frobber.Gizmo" 
      clsid="{00028C00-0000-0000-0000-000000000046}" 
      description="Gizmo Frobber by Contoso" 
      threadingModel = "Apartment" /> 

     <typelib 
      tlbid="{00028C01-0000-0000-0000-000000000046}" 
      version="1.0" 
      helpdir=""/> 
    </file> 
</assembly> 

और blingo blango, आप काम कर दिया जाना चाहिए।

+0

इस का एक संयोजन और टीएसबी से इंटरऑप असेंबली उत्पन्न करने के लिए PeskyGnat द्वारा सुझाव सीधे अंततः COM घटक या इसकी प्रकार की लाइब्रेरी पंजीकृत किए बिना काम कर रहा है। बहुत बहुत धन्यवाद। – Neutrino

+0

यह मैनिफेस्ट मेरे लिए लगभग काम करता है, लेकिन मुझे निर्भरता के नाम के अंत में ".dll" डालना पड़ा था, उदाहरण के रूप में: _ = mycomserver.dll "। –

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