2011-01-25 18 views
6

में दृढ़ता से टाइप किए गए तर्कों को पास करना मेरे पास COM इंटरऑप के माध्यम से दो .NET कक्षाएं सामने आई हैं - चलो फू और बार कहें, और मुझे बार में परिभाषित विधि में फू प्रकार के तर्क को पारित करने की आवश्यकता है। कुछ इस तरह:.NET COM इंटरऑप

[ComVisible(true)] 
public class Foo 
{ 
    // whatever 
} 

[ComVisible(true)] 
public class Bar 
{ 
    public void Method(Foo fff) 
    { 
     // do something with fff 
    } 
} 

जब मैं निम्नलिखित VBS (cscript.exe का उपयोग) चलाएँ:

D:\test.vbs(3, 1) Microsoft VBScript runtime error: Invalid procedure call or argument: 'bar.Method'

अगर मैं बदल हालांकि,:

set foo = CreateObject("TestCSProject.Foo") 
set bar = CreateObject("TestCSProject.Bar") 
call bar.Method(foo) 

मैं कोई त्रुटि मिलती है इस विधि की घोषणा:

public void Method(object o) 
    { 
     Foo fff = (Foo)o; 
     // do something with fff 
    } 

सबकुछ काम करता है। मैंने इंटरफेस, विशेषताओं इत्यादि के साथ कुछ जादू की कोशिश की लेकिन अब तक कोई भाग्य नहीं है।

कोई अंतर्दृष्टि?

बहुत धन्यवाद

+0

इसे पोस्ट के रूप में काम करना चाहिए, वीबीस्क्रिप्ट देर से बाध्यकारी का उपयोग करता है। एक उदाहरण बनाने के लिए अपने स्निपेट को बेहतर बनाने का प्रयास करें जो उसी तरह विफल हो। –

+0

@ हंस - मैंने वीबीएस स्निपेट जोड़ा जो विफल रहता है। असली कोड से कॉपी/चिपकाया सबकुछ। धन्यवाद – Elephantik

उत्तर

6

यकीन है, तो आप एक GUID विशेषता परिभाषित करते हैं, क्योंकि यह आवश्यक है जब आप (वीबी शायद करता है) एक QueryInterface बनाते हैं। आपको प्रत्येक कॉम्विसिबल क्लास के लिए एक नया अद्वितीय GUID उत्पन्न करना होगा।

[Guid("77777777-3333-40df-9C0D-2B580E7E1F3B")] 
[ComVisible(true)] 
public class Foo 
{ 
} 

तो मैं दृढ़ता से अपने COM ऑब्जेक्ट के लिए इंटरफेस लिखने के लिए सिफारिश करेंगे, और कोई नहीं करने के लिए ClassInterface निर्धारित करते हैं, इसलिए कोई आंतरिक पता चला रहे हैं। आपकी टाइपलाइनर इस तरह से अधिक क्लीनर होगी।

[Guid("88888888-ABCD-458c-AB4C-B14AF7283A6B")] 
[ComVisible(true)] 
public interface IFoo 
{ 
} 

[ClassInterface(ClassInterfaceType.None)] 
[Guid("77777777-3333-40df-9C0D-2B580E7E1F3B")] 
[ComVisible(true)] 
public class Foo : IFoo 
{ 
} 
+0

वीबी विशिष्ट इंटरफ़ेस के लिए क्वेरी नहीं करता है। यह 'आईडीस्पैच' का उपयोग करता है। वैसे भी, समस्या यहां 'फू' पैरामीटर मार्शल के तरीके से थी। – Ran

+0

@Ran इसे मार्शलिंग के साथ, अज्ञात के रूप में आप एलिफैंटिक के समान पैरामीटर घोषित करने के साथ ही ऐसा कर रहे हैं, जो काम करता है लेकिन यह मजबूत टाइप नहीं है। IDISpatch सीधे IU अज्ञात से विरासत में मिलता है, इसलिए एक विशिष्ट इंटरफ़ेस (या कक्षा) के लिए पूछते समय वीबी क्वेरी क्वेरी इंटरफेस का उपयोग कर सकता है। – martinstoeckli

+0

असल में, मैंने ऐसा किया। इंटरफेस बनाया, सबकुछ GUIDed, लेकिन कोई भाग्य नहीं। मैं बस स्रोत कोड बाढ़ नहीं करना चाहता था। – Elephantik

2

थोड़ी देर के लिए यह एक ही मुद्दे के साथ संघर्ष करने के बाद, मैंने पाया कि संदर्भ के बजाय मूल्य द्वारा argments गुजर के साथ मुद्दों कर दिया गया था। यहाँ देखें:

http://msdn.microsoft.com/en-us/library/ee478101.aspx

वीबी स्क्रिप्ट में पारित तर्क को तो मैं अभी-अभी जोड़ा दौर कोष्ठक, और यह समस्या हल है लग रहा था। अपने उदाहरण में तो, बस यह कर:

Set foo = CreateObject("TestCSProject.Foo") 
Set bar = CreateObject("TestCSProject.Bar") 
Call bar.Method((foo)) 

ClassInterface विशेषता सेट किए बिना अपेक्षा के अनुरूप काम करना चाहिए, और इंटरफेस का उपयोग किए बिना।

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