RegFree COM работает с C#, НЕ работает с VBA

В настоящее время я пытаюсь заставить COM без регистрации работать с Excel в качестве клиента и .NET dll в качестве сервера. В настоящее время я просто пытаюсь заставить работать доказательство концепции, но у меня проблемы.

Очевидно, что поскольку я использую Excel, я не могу просто использовать манифест клиента, находящийся рядом с исполняемым файлом, поэтому я использую Microsoft.Windows.ActCtx( ссылка)

У меня есть манифест клиента, манифест сборки и dll в одном месте.

К сожалению, то, что работает в C#, не работает в Excel/VBA, и я не могу понять причину.В то время как тестовый клиент C# работает отлично, VBA выдает ошибку 80070002с сообщением Method 'CreateObject' объекта 'IActCtx' failed.

У меня есть .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):



    
    
        
            
        
    

Манифест сборки (COMTestService.manifest):



    
    
    
            
    

Код клиента 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

Код клиента C#:

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);

EDIT

Сюжет сгущается... Просто для удовольствия, Я написал быстрый COM-видимый, ЗАРЕГИСТРИРОВАННЫЙ вспомогательный класс для создания объекта на C#, а затем передал его обратно, используя метод, аналогичный общедоступному объекту CreateObject(string manifestPath, string typeName). Теперь вызов это из исполняемого файла C # работает нормально, но вызов его из VBA завершается с ошибкой (снова 80070002, сообщение: Система не может найти указанный файл. ). Теперь я еще больше запутался...

Заранее спасибо за любую помощь, и если мне понадобится дополнительная информация, просто дайте мне знать, и я буду рад помочь!

10
задан Simon Cowen 21 March 2012 в 16:10
поделиться