5

का उपयोग कर एएसपी क्लासिक के लिए एक COM इंटरऑप लाइब्रेरी का निर्माण करना कई अलग-अलग लेखों के माध्यम से जाने के बाद और कुछ भी विशेष रूप से निर्णायक नहीं है जो मुझे प्रक्रिया के माध्यम से चरण-दर-चरण लेता है, मैं मदद मांगा ।4.0 ढांचे और विजुअल स्टूडियो 2010

परिदृश्य

मेरा एक ग्राहक ASP Classic के लिए विकास में केवल प्रवीण है। उन्होंने हाल ही में एएसपी.नेट में लिखी गई साइट के लिए एक खाता प्राप्त किया है। वे साइट को सक्रिय रूप से बनाए रखने वाले किसी चीज़ में घुमा रहे हैं, लेकिन साइट में मूल रूप से एक छवि हैंडलर शामिल था जिसने पानी के स्तर के बारे में गतिशील रूप से डेटा बदल दिया और उस डेटा के ग्राफिकल प्रतिनिधित्व वाले एक छवि को आउटपुट किया। COM इंटरऑप लाइब्रेरी विकसित करने की आवश्यकता है जिसे सर्वर पर पंजीकृत किया जा सकता है और Response.BinaryWrite का उपयोग करके आउटपुट के लिए समान छवि के बाइट सरणी उत्पन्न करने के लिए CreateObject के साथ बुलाया जाता है। COM इंटरऑप लाइब्रेरी को Windows 2000 सर्वर पर दूरस्थ साइट पर पंजीकृत होना चाहिए, और मैं उस कार्य को पूरा करने के लिए regasm/gacutil तक पहुंचने के बारे में कोई धारणा नहीं कर सकता।

कठिनाई

मैं दृश्य स्टूडियो 2010 में एक कक्षा लाइब्रेरी परियोजना बनाने के द्वारा वर्ग पुस्तकालय का निर्माण किया है, टेम्पलेट से चुनने "COM कक्षा", और मेरे कोड डालने के साथ एक वर्ग उत्पन्न करने के लिए एक पूर्णांक दिया गया है (अच्छी तरह से, गणनाकर्ता, लेकिन सभी एक ही) जब एक बाइट सरणी वापस करने के लिए एक एकल विधि। दुर्भाग्यवश, लाइब्रेरी बनाने और पंजीकरण (regacasm) को पंजीकृत करने और असेंबली (gacutil) को कैश करने के बाद भी अपनी खुद की विकास मशीन पर, मैं ऑब्जेक्ट को तुरंत चालू करने के लिए क्लासिक एएसपी के माध्यम से कॉल नहीं कर सकता, इसके बजाय "ActiveX घटक नहीं बना सकता ऑब्जेक्ट "त्रुटि। और, ज़ाहिर है, सर्वर साइट पर, डीएलएल फ़ाइल पंजीकृत नहीं की जा सकती है, प्रतिक्रिया "आवश्यक मॉड्यूल नहीं मिला था।"

संसाधन मैं

मैं पहले से ही निम्न लेख के माध्यम से एक बार देख लिया है उपयोग किया है और जवाब की आवश्यकता अप चालू नहीं किया है:

  1. (बेसिक कदम) Walkthrough: Creating COM Objects with Visual Basic
  2. Build and Deploy a .NET COM Assembly
  3. .NET COM+ Interop Component with Classic ASP

क्या मैं आवश्यकता

अनिवार्य रूप से मैं क्या जरूरत है क्या यह आवश्यकताओं को पूरा करने और एक COM+ इंटरॉप मॉड्यूल सही ढंग से बनाने के लिए जा रहा है की चरण दर चरण का एक प्रकार पर सुविधाजनक उपकरणों का एक सा विजुअल स्टूडियो 2010 में। वास्तविक वर्ग ऑब्जेक्ट बनाना स्वयं बहुत कठिन नहीं है।

हालांकि, मैंने देखा है कि लेखों में से कोई भी वास्तव में प्रोजेक्ट विकल्प पर चर्चा नहीं करता है या विजुअल स्टूडियो 2010 या .NET 4.0 फ्रेमवर्क के साथ प्रक्रियाओं का निर्माण करता है, और न ही उनमें से कोई भी वास्तव में चर्चा करता है अगर पुराने सिस्टम पर तैनाती के लिए विशेष विचार हैं जैसे कि विंडोज सर्वर 2000 और लाइब्रेरी के वास्तविक पंजीकरण केवल सिस्टम पर, कहते हैं, regsvr32 हाथ पर।

+0

उन सभी जो पीछे आ के लिए: एक छोटे से अधिक होमवर्क करने पर, मैं यहाँ नोट करने के लिए मैं भी .NET 2.0 फ्रेमवर्क के लिए अपने पुस्तकालय को लक्षित करने के लिए आवश्यक है कि के रूप में है कि नवीनतम ढांचे के द्वारा समर्थित है चाहता था विंडोज सर्वर 2000. – lsuarez

उत्तर

11

यह बुनियादी प्राप्त करने के लिए काफी सरल होना चाहिए।एनईटी असेंबली COM से अवगत कराई गई - मैंने कभी भी क्लास क्लास प्रोजेक्ट टेम्पलेट का प्रयास नहीं किया है, इसलिए मैंने इसे अतीत में प्रबंधित किया है:

सी # या वीबी का उपयोग कर एक नया (बोग मानक) .NET क्लास लाइब्रेरी बनाएं ।

[ComVisible(true)] 
[Guid("8999F93E-52F6-4E29-BA64-0ADC22A1FB11")] 
public interface IComm 
{ 
    string GetMyGroups(); 
} 

अब (, फिर से अपने खुद के साथ GUIDs की जगह) एक वर्ग है कि इंटरफ़ेस को लागू करता है परिभाषित:

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.None)] 
[GuidAttribute("C5C5A1A8-9BFB-4CE5-B42C-4E6688F6840B")] 
[ProgId("Test.Comm.1")] 
public class Comm : IComm 
{ 
    public string GetMyGroups() 
    { 
     var comm = new CommunicatorAPI.MessengerClass(); 

     var groups = comm.MyGroups as IMessengerGroups; 
     return string.Join(", ", groups.OfType<IMessengerGroup>().Select(g => g.Name).ToArray()); 
    } 
} 

इस पर प्रोग्राम आईडी विशेषता एक COM इंटरफेस (अपने स्वयं के साथ GUIDs की जगह) को परिभाषित करें एएसपी से अपने घटक को तुरंत चालू करने के लिए आप कक्षा का उपयोग करेंगे।

दृढ़ता से नामकरण विधानसभा (परियोजना गुण -> "हस्ताक्षर" टैब - "विधानसभा साइन"> -> एक नया मजबूत नाम कुंजी लटकती का उपयोग कर फ़ाइल बनाएँ)

अब, विधानसभा का निर्माण, और रजिस्टर Regasm का उपयोग करके - यदि आप जीएसी में पंजीकरण नहीं करना चाहते हैं (जो मैं अनुशंसा करता हूं, क्योंकि जीएसींग तैनाती को आसान नहीं रखता है), तो -डेडबेस पैरामीटर का उपयोग करना सुनिश्चित करें (यह केवल एक reg प्रविष्टि जोड़ता है जो ग्राहकों को बताता है कि कहां से विधानसभा लगता है) - उदाहरण के लिए:

regasm ClassLibrary2.dll /codebase "S:\Testing\ClassLibrary2\ClassLibrary2\bin\Debug\ClassLibrary2.dll" 

अब आप घटक का दृष्टांत, और उस पर तरीकों कॉल करने के लिए सक्षम होना चाहिए - उदाहरण के लिए (i (प्रोग्राम आईडी, या कॉम के आधार पर

var a = new ActiveXObject("Test.Comm.1"); 
alert(a.GetMyGroups()); 

यह तैनाती की बात आती है, महत्वपूर्ण काम Regasm और Regsvr32 है कि, रजिस्ट्री में विभिन्न सेटिंग्स लिखने के लिए इतना है कि ग्राहकों COM घटक मिल सकती है: n जावास्क्रिप्ट) कक्षा आईडी)। आपको बस इतना करना है कि जब आप अपनी स्थानीय मशीन पर रेजिम चलाते हैं तो COM सेटिंग्स लिखी जा रही हैं, और सर्वर पर रजिस्ट्री में लिखें। Regasm चलाए जाने पर रजिस्ट्री में जो लिखा जाता है उसकी निगरानी करने के लिए आप ProcMon का उपयोग कर सकते हैं।

सामान्य शब्दों में, आप इस रजिस्ट्री में लिखा की तरह कुछ देखने की उम्मीद कर सकते हैं:

[HKEY_CLASSES_ROOT\Test.Comm.1] 
@="ClassLibrary2.Comm" 

[HKEY_CLASSES_ROOT\Test.Comm.1\CLSID] 
@="{00585504-90C8-4760-A359-67CAF08FFED1}" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}] 
@="ClassLibrary2.Comm" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories] 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}] 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32] 
@="mscoree.dll" 
"ThreadingModel"="Both" 
"Class"="ClassLibrary2.Comm" 
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a" 
"RuntimeVersion"="v4.0.30319" 
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\InprocServer32\1.0.0.0] 
"Class"="ClassLibrary2.Comm" 
"Assembly"="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cf55d4e60653257a" 
"RuntimeVersion"="v4.0.30319" 
"CodeBase"="file:///S:/Testing/ClassLibrary2/ClassLibrary2/bin/Debug/ClassLibrary2.DLL" 

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{00585504-90C8-4760-A359-67CAF08FFED1}\ProgId] 
@="Test.Comm.1" 

आशा इस मदद करता है :)

+0

बहुत बहुत धन्यवाद। COM क्लास रैपर को VS2010 में टेम्पलेट द्वारा नियंत्रित किया जाता है, ताकि भाग कम से कम सुविधाजनक हो। मैंने अपने पिछले निर्माण में मजबूत नाम कुंजी को संभाला है क्योंकि बहुत सारी टिप्पणियों/लेखों का उल्लेख किया गया है। मुझे लगता है कि भेद यह है कि मुझे नहीं पता था ** [प्रोगिड ("टेस्ट.कॉम .1")] ** असेंबली पर लेबल होगा जो मुझे आमंत्रित करने की आवश्यकता होगी। यह मुझे थोड़ा सा मदद कर सकता है! मैं निश्चित रूप से आपको बताने के लिए निश्चित रहूंगा कि क्या आपकी पूरी तरह से मदद ने ASAP को प्रतिबंधित कर दिया है। – lsuarez

+0

कोई समस्या नहीं - यह आपके लिए कैसे काम करता है? –

+0

खैर, विडंबना यह है कि आखिर में मुझे इस मुद्दे पर कुछ संकल्प मिल गया है, Win2k सर्वर को विन 2k8 बॉक्स द्वारा प्रतिस्थापित किया गया है, इसलिए हम एएसपी के साथ-साथ .NET पक्ष में एएसएचएक्स हैंडलर को बस बनाएंगे। हालांकि, जहां तक ​​मेरी विकास मशीन पर चीजें चल रही हैं, आपने मुझे इसे हल करने में मदद की। :] – lsuarez

1

मैं एक क्लासिक एएसपी वेब साइट पर एक VB6 COM वस्तु का उपयोग करता है। मैं वीबी 6 के बजाय .NET का उपयोग कर COM ऑब्जेक्ट का एक नया संस्करण बनाना चाहता था। इस तरह मैंने यह किया (उम्मीद है कि यह मदद करता है)। मैं सी # और वीबी.नेट दोनों के लिए निर्देश शामिल करता हूं।

[01]

  • प्रारंभ विजुअल स्टूडियो 2015 (व्यवस्थापक के रूप में चलाने)।
  • एक नया "क्लास लाइब्रेरी" प्रोजेक्ट बनाएं।
  • नाम यह: "DotNetCom"

[02] सी #

  • एक नया वर्ग, नाम यह "HelloCOM" जोड़ें।
  • टेम्पलेट शुरू करने

(अधिक जानकारी के लिए पर जाएँ https://msdn.microsoft.com/en-us/library/c3fd4a20.aspx)

using System.Runtime.InteropServices; 

    namespace DotNetCom 
    { 
     [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")] 
     public interface HelloCOMInterface 
     { 
      [DispId(1)] 
      string Hello(); 
     } 

     [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"), 
      InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
     public interface HelloCOMEvents 
     { 
     } 

     [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"), 
      ClassInterface(ClassInterfaceType.None), 
      ComSourceInterfaces(typeof(HelloCOMEvents))] 
     public class HelloCOM : HelloCOMInterface 
     { 
      public string Hello() 
      { 
       return "Hello there!"; 
      } 
     } 
    } 

[02] VB.NET

  • एक नया "COM वर्ग के रूप में जोड़ें निम्नलिखित कोड का उपयोग ", इसे" हैलोकॉम "नाम दें।
  • वीबी.नेट प्रारंभिक टेम्पलेट बनाता है।
  • "हैलोकॉम" कक्षा में निम्न कार्य जोड़ें।

    Public Function Hello() As String 
        Return "Hello there!" 
    End Function 
    

[03] सी #

  • ओपन परियोजना गुण।
  • "एप्लिकेशन" पर जाएं।
  • "असेंबली सूचना ..." पर क्लिक करें।
  • "असेंबली COM-Visible बनाएं"
  • "बिल्ड" पर जाएं।
  • "प्लेटफ़ॉर्म लक्ष्य: x86" चुनें।
  • चेक "इंटरॉप के लिए रजिस्टर कॉम"

[03] VB.NET

  • खोलें "MyProject"।
  • "संकलन" पर जाएं।
  • "लक्ष्य सीपीयू: x86" चुनें।

[04]

  • बनाएँ "DotNetCom.dll"।

[05]

  • खुला एक कमांड प्रॉम्प्ट (व्यवस्थापक के रूप में चलाने)।
  • अपनी डीएलएल में निर्देशिका बदलें।

    cd DotNetComTest\DotNetComTest\TX7NGN.COM\bin\Debug 
    
  • RegAsm/codebase चलाएं।

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm DotNetComTest.dll /codebase "C:\DotNetComTest\DotNetComTest\bin\Debug\DotNetComTest.dll" 
    

[06]

  • प्रारंभ घटक सेवाएँ।
  • एक नया COM + एप्लिकेशन जोड़ें।
  • इसे नाम दें: "DotNetCom"।
  • "DotNetCom" गुणों को खोलें।
  • "सुरक्षा टैब" पर जाएं।
  • UNCHECK "इस एप्लिकेशन के लिए एक्सेस चेक लागू करें"।

[07]

  • एक नया घटक जोड़ें।
  • "DotNetComTest.tlb" चुनें ("DotNetComTest.dll" का चयन न करें)।

[08]

  • उपयोग क्लासिक एएसपी पेज से COM वस्तु।

    <% 
    Dim HelloCOM 
    Set HelloCOM = Server.CreateObject("DotNetCom.HelloCOM") 
    Response.Write HelloCom.Hello 
    %> 
    
संबंधित मुद्दे