2012-03-21 13 views
10

से काम नहीं कर रहा है मैं क्लाइंट के रूप में एक्सेल के साथ काम कर रहे पंजीकरण-मुक्त COM और सर्वर के रूप में .NET dll प्राप्त करने का प्रयास कर रहा हूं। वर्तमान में मैं बस सबूत की अवधारणा को काम करने की कोशिश कर रहा हूं लेकिन मुझे परेशानी हो रही है।सी # से काम नहीं कर रहे रेगफ्री कॉम, वीबीए

जाहिर

, जैसा कि मैंने एक्सेल का उपयोग कर रहा हूँ, मैं बस निष्पादन के साथ-साथ एक ग्राहक प्रकट रहने वाले उपयोग नहीं कर सकते, तो मैं उपयोग कर रहा हूँ Microsoft.Windows.ActCtx (link)

मैं ग्राहक प्रकट, विधानसभा प्रकट, और dll है सब एक ही स्थान पर।

दुर्भाग्य से, सी # में क्या काम करता है एक्सेल/वीबीए में काम नहीं करता है और मैं कारण के रूप में फंस गया हूं। जबकि सी # टेस्ट क्लाइंट पूरी तरह से काम करता है, वीबीए त्रुटि देता है, संदेश ऑब्जेक्ट 'IActCtx' की विधि 'CreateObject' विफल हुई।

मैं यहाँ के रूप में एक .NET dll (COMTestService.dll) एकल वर्ग/इंटरफेस COM (COMTestObject/ICOMTestObject) को उजागर किया है,:

[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
[Guid("EEE50CDF-D8EC-4F38-B986-C231EC45171E")] 
public interface ICOMTestObject 
{ 
    [ComVisible(true)] 
    string GetString(int number); 
} 

[ComVisible(true), ClassInterfaceAttribute(ClassInterfaceType.None), ComDefaultInterface(typeof(ICOMTestObject))] 
[Guid("6E54611B-8B56-49E0-9415-E59B0774A4BE")] 
public class COMTestObject : ICOMTestObject 
{ 
    public COMTestObject() 
    { 
    } 

    public string GetString(int number) 
    { 
     return string.Format("The number is: {0}", number); 
    } 
} 

ग्राहक प्रकट (COMTestService_Client.manifest):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly 
    manifestVersion="1.0" 
    xmlns="urn:schemas-microsoft-com:asm.v1" > 
    <assemblyIdentity 
     name="client" 
     version="1.0.0.0" /> 
    <dependency> 
     <dependentAssembly> 
      <assemblyIdentity 
       name="COMTestService" 
       version="1.0.0.0" 
       processorArchitecture="msil" /> 
     </dependentAssembly> 
    </dependency> 
</assembly> 

विधानसभा प्रकट (COMTestService.manifest):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly 
    manifestVersion="1.0" 
    xmlns="urn:schemas-microsoft-com:asm.v1" > 
    <assemblyIdentity 
     name="COMTestService" 
     version="1.0.0.0" 
     processorArchitecture="msil" /> 
    <clrClass 
     clsid="{6E54611B-8B56-49E0-9415-E59B0774A4BE}" 
     progid="COMTestService.COMTestObject" 
     threadingModel="Both" 
     name="COMTestService.COMTestObject" 
     runtimeVersion="v4.0.30319"> 
    </clrClass> 
    <file 
     name="COMTestService.dll" 
     hashalg="SHA1">   
    </file> 
</assembly> 

VBA ग्राहक कोड:

Dim actCtx As Object 
Set actCtx = CreateObject("Microsoft.Windows.ActCtx") 
actCtx.Manifest = "...\COMTestService_Client.manifest" 

Dim testObject As Object 
Set testObject = actCtx.CreateObject("COMTestService.COMTestObject") 'This line throws... 

Dim text As String 
text = thing.GetString(42) 

Debug.Print text 

सी # क्लाइंट कोड:

var actCtxType = System.Type.GetTypeFromProgID("Microsoft.Windows.ActCtx"); 
dynamic actCtx = System.Activator.CreateInstance(actCtxType); 
actCtx.Manifest = @"...\COMTestService_Client.manifest"; 

var type = System.Type.GetTypeFromProgID("COMTestService.COMTestObject"); 
dynamic obj = System.Activator.CreateInstance(type); 
dynamic s = obj.GetString(42); 

संपादित

साजिश गाढ़ा हो ... बस मस्ती के लिए, मैं एक त्वरित COM-दिखाई लिखा था, सी # में ऑब्जेक्ट सृजन करने के लिए पंजीकृत हेल्पर क्लास, फिर public object CreateObject(string manifestPath, string typeName) की लाइनों के साथ एक विधि का उपयोग करके इसे वापस पास करें, इसे सी # एक्सई से कॉल करना ठीक काम करता है, लेकिन इसे वीबीए से कॉल करने में विफल रहता है (80070002 फिर से, संदेश: सिस्टम निर्दिष्ट फ़ाइल नहीं मिल सकता है।)। अब मैं और भी उलझन में हूं ...

किसी भी मदद के लिए अग्रिम धन्यवाद, और अगर मुझे और जानकारी की आपूर्ति करने की ज़रूरत है तो मुझे बताएं और मुझे खुशी होगी!

+0

आपके द्वारा पारित प्रकटीकरण पथ अमान्य है, तीन बिंदुओं का उपयोग नहीं कर सकता है। और आपको निश्चित रूप से एक पूर्ण पथ की आवश्यकता है, आप भविष्यवाणी नहीं कर सकते कि वर्तमान कार्यशील निर्देशिका क्या होगी। –

+0

उलझन में खेद है, यह सिर्फ एक प्लेसहोल्डर था। पथ पूरी तरह से है, और सही है। –

उत्तर

0

मैं नहीं कह सकता कि मैंने कभी भी उस तकनीक का उपयोग करने की कोशिश की है और मैंने वर्षों से बहुत सारे इंस्टॉल किए हैं। मुझे आश्चर्य है, क्यों न सिर्फ अपने .NET COM Visible सर्वर को पंजीकृत करें? रजिस्ट्रेशन रजिस्ट्री में बहुत साफ और हल्के वजन COM पंजीकरण बनाने के लिए जाता है। सुदूर क्लीनर तो पुराने अप्रबंधित DllRegisterServer() सामान।

+0

दुर्भाग्य से यह व्यवस्थापक अधिकारों की संभावना के बिना तैनात किया जा रहा है, इसलिए खिड़की से बाहर निकलता है ... –

+0

इंस्टॉलशील्ड एमएसआई परियोजनाओं में ".NET COM Visible" विशेषता है जो COM मेटा डेटा निकालने के लिए बिल्ड समय पर RegAsm को आमंत्रित करती है। प्रति-उपयोगकर्ता स्थापना के मामले में COM कुंजी HKLM \ Software \ Classes के बजाय HKCU \ Software \ Classes पर लिखी जाती हैं। मैं नहीं देखता कि RegAsm शैली COM पंजीकरण प्रश्न से बाहर कैसे है। –

2

प्रोसेस मॉनीटर का उपयोग करके, मैंने पाया कि डीएल की खोज सी:/प्रोग्राम फाइल/माइक्रोसॉफ्ट ऑफिस/ऑफिस 11/में की जा रही थी। मैंने अपने सभी डीएलएस को वहां पर ले जाया और त्रुटि चली गई।

एक sidenote पर, अगर कोई जानता है कि एक्सेल को अपनी फाइलों के लिए वहां क्यों नहीं दिखाना है, बल्कि इसके बजाय जहां .tlb पाया गया था, मुझे रूचि है। (मैंने पहले ही पाथ पर्यावरण परिवर्तक के पथ को जोड़ने का प्रयास किया है)

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