से काम नहीं कर रहा है मैं क्लाइंट के रूप में एक्सेल के साथ काम कर रहे पंजीकरण-मुक्त 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 फिर से, संदेश: सिस्टम निर्दिष्ट फ़ाइल नहीं मिल सकता है।)। अब मैं और भी उलझन में हूं ...
किसी भी मदद के लिए अग्रिम धन्यवाद, और अगर मुझे और जानकारी की आपूर्ति करने की ज़रूरत है तो मुझे बताएं और मुझे खुशी होगी!
आपके द्वारा पारित प्रकटीकरण पथ अमान्य है, तीन बिंदुओं का उपयोग नहीं कर सकता है। और आपको निश्चित रूप से एक पूर्ण पथ की आवश्यकता है, आप भविष्यवाणी नहीं कर सकते कि वर्तमान कार्यशील निर्देशिका क्या होगी। –
उलझन में खेद है, यह सिर्फ एक प्लेसहोल्डर था। पथ पूरी तरह से है, और सही है। –