2008-12-05 13 views
6

में एक कस्टम .NET DLL तक पहुंचें मैंने .NET में एक DLL लिखा था और मैं इसे VBScript में एक्सेस करना चाहता हूं। मैं इसे असेंबली निर्देशिका में जोड़ना नहीं चाहता हूं।वीबीस्क्रिप्ट

क्या डीएलएल को इंगित करने और इसका एक उदाहरण बनाने का कोई तरीका है?

उत्तर

5

/codebase पैरामीटर निर्दिष्ट करके आप regasm utility के साथ .NET dll पंजीकृत कर सकते हैं। इस पैरामीटर को हस्ताक्षरित असेंबली के साथ उपयोग करने के लिए प्रोत्साहित नहीं किया जाता है, लेकिन यह तब काम करता है जब आप अपनी असेंबली को जीएसी में नहीं डाल सकते हैं।

regasm your.dll /codebase 

कृपया ध्यान दें कि आप इस ऑपरेशन के बाद अपने .dll के पथ परिवर्तन नहीं होना चाहिए, क्योंकि यह Windows रजिस्ट्री में इस पथ सम्मिलित करता है।

+0

मारा एक बार आप यह कर आप कैसे पंजीकरण रद्द कर सकता हूँ? –

+1

regasm your.dll/unregister – huseyint

1

सीधे नहीं। आपको किसी भी .NET लाइब्रेरी में COM COM (और इसलिए, VBScript) से कॉल करने के लिए एक COM Callable Wrapper की आवश्यकता होगी। इसलिए, आपको या तो सीधे डीएलएल में सीसीडब्ल्यू बनाना चाहिए या आप प्रॉक्सी डीएलएल के लिए सीसीडब्ल्यू बना सकते हैं जो .NET DLL को लोड करने के लिए जेनेरिक तरीके प्रदान करता है और आपके लिए विधियों को प्रदान करता है जो घटक पर वास्तविक विधियों को कॉल करता है और परिणाम देता है। यह वास्तव में बिल्कुल साफ नहीं है। तो, सामान्य रूप से, जवाब नहीं है।

6

huseyint का जवाब पैसे पर था, हालांकि, मैं इसे थोड़ा जोड़ना चाहता था। यहां कुछ नमूना कोड मैं इस बहुत जारी करने के लिए प्रयोग किया जाता है, शायद यह आप के साथ लाने के कर सकते हैं ...

// bind a variabe to WScript.Shell 
Set WshShell = CreateObject("WScript.Shell") 

// define the path to the regasm.exe file 
RegAsmPath = "c:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" 

// register the dll 
WshShell.run "cmd /c " & RegAsmPath & " c:\temp\cbsecurity.dll /codebase /nologo /s", 0, True 

// bind a variable to the dll 
Set cbUtil = CreateObject("CBSecurity.Utilities") 

मैं dll में एक IsAlive विधि ...

Public Function IsAlive() As Boolean 
    Return True 
End Function 

को शामिल किया था ... और जांच कर सकता है कि इसे सही ढंग से सिंटैक्स का उपयोग पंजीकरण दिनांक:

//check if dll is available to your code 
msgbox "cbUtil is alive: " & cbUtil.IsAlive 

आशा इस कोई मदद करता है ...

12

मैं सिर्फ इस अपने आप को करना था, मेरे निष्कर्ष थे:

प्रकार कॉम को दिखाई बनाना:

  1. सुनिश्चित करें कि आपका वर्ग सार्वजनिक, गैर स्थिर है और एक सार्वजनिक डिफ़ॉल्ट निर्माता अर्थात तर्क नहीं है।
  2. सुनिश्चित करें कि आपकी विधि सार्वजनिक, गैर स्थैतिक है।
  3. सुनिश्चित करें कि आपके असेंबली पर निम्नलिखित सेट है - आमतौर पर AssemblyInfo में।सीएस

    [assembly: ComVisible(true)] 
    
  4. एसडीके कमांड लाइन चलाने से, अपने DLL के निर्माण के बाद:

    regasm yourdll.dll 
    

    यह जवाब देना चाहिए: सफलतापूर्वक पंजीकृत

    आप

    मिलता है

    प्रकार

    RegAsm: चेतावनी RA0000: नहीं प्रकार

    दर्ज किए गए थे तो आप ComVisible सेट करना होगा या कोई सार्वजनिक, गैर स्थिर प्रकार हैं।

PowerShell

$a = New-Object -comobject Your.Utils.Logging 
$a.WriteError2("Application", "hello",1,1) 

से vbs

Set logger = CreateObject("Your.Utils.Logging") 
logger.WriteError2 "Application", "hello from vbs",1,1 
+0

ग्रेट उत्तर, आपने प्रत्येक चरण को शामिल किया है। बहुत बहुत धन्यवाद। – lidermin

+0

धन्यवाद, यह एक गुच्छा में मदद करता है। चरण 3 वह था जिसे मैं याद कर रहा था! – mlsteeves

+0

@foolshat .. क्या यह सर्वर है। बनाएं ऑब्जेक्ट या CreateObject – Vani

4

मामले किसी में से डिबग करने के लिए की जरूरत है/कदम दर में नेट dll कि केवल VBScript से कहा जाता है:

  1. .NET dll प्रोजेक्ट डीबग सेटअप स्क्रीन पर, wscript.exe प्रोग्राम (C: \ WINDOWS \ system32 \ wscript.exe में स्थित) पर ब्राउज़ करके "बाहरी प्रोग्राम प्रारंभ करें" सेट करें।

  2. "कमांड लाइन तर्क" पर, VBScript फ़ाइल (सी: \ टेस्ट \ myTest.vbs) का फ़ाइल नाम और पथ स्थान सेट करें। सुनिश्चित करें कि vbs फ़ाइल और dll फ़ाइल एक ही स्थान पर हैं।

  3. अंत में, नेट परियोजना DLL स्रोत कोड में सिर्फ तोड़ बिंदु निर्धारित और "शुरू डिबग"