2012-01-17 7 views
1

Я использую COM видимую библиотеку C#, которую я вызываю из VBA в Excel. Вызываемый метод C# включает аргументы, переданные ref. Я использую VS2010, Office 2010, .NET Framework 4.VBA/C# COM interop - Ошибка 430

  • В более ранней версии моего файла Excel, вызов библиотеки прекрасно работает и до сих пор.

  • В новой версии (сам вызов библиотеки C# не изменился), VBA удается вызвать библиотеку, однако при завершении метода C# я получаю ошибку времени выполнения 430 «Класс не поддерживает автоматизацию или не поддерживает ожидаемый интерфейс ». Для этого я использовал режим DEBUG. В том же файле VBA удается вызвать развернутую библиотеку .NET.

Что я пробовал: - Re-добавления ссылки на библиотеку OLE Automation в VBA. - Повторная сборка библиотеки C#

Я немного озадачен тем, что может быть неправильным и где. Сам Excel, похоже, не является проблемой, так как работает мой старый файл. Библиотека C# вызывается из моего старого файла, поэтому проблема не должна возникать из библиотеки. Что касается способности моего файла вызывать COM видимые библиотеки, ну, то вызов другой библиотеки C# работает (тот, который развернут).

Любая помощь была бы высоко оценена!


УВА вызов CSharp выглядит следующим образом:

Dim csharptoolsDispatch As Object 
Set csharptoolsDispatch = CreateObject("Dispatch.Caller") 
Dim a as string 
ReDim input(0 to 5) as single 
ReDim output(0 to 5) as single 
a = csharptoolsDispatch.solveDispatch(2, False, input, output) 

C# выглядит следующим образом:

-Интерфейс

namespace Dispatch 
{ 
    public interface iCaller 
    { 
     string solveDispatch(int a, bool flag, float[] input, ref float[] output); 
    } 
} 

-Класс

namespace Dispatch 
{ 
    [ClassInterface(ClassInterfaceType.None)] 
    [ComVisible(true)] 
    public class Caller : iCaller 
    { 
     public string solveDispatch(int a, bool flag, float[] input, ref float[] output) 
     {  
      //code 
      return "ok"; 
     } 
    } 
} 

Вызов метода Csharp работает отлично, Csharp работает отлично и сразу после «возврата» ok », когда« фокус »возвращается на VBA, я получаю сообщение об ошибке 430.

+0

Можете ли вы разместить фактическую строку (ы), где она не работает? В этом сообщении об ошибке говорится, что вы пытаетесь сделать что-то, что либо C# interop, либо Excel не поддерживает то, что вы просили его сделать. Поскольку он работает с более старой версией файла, кажется вероятным, что вы просите excel 2010 сделать что-то, используя snytax 2003. Наблюдение за некоторым кодом должно позволить нам определить, что это такое. – Pynner

+0

Просто отправил код в соответствии с запросом. Оба файла excel - это файлы excel 2010. – user1153715

ответ

2

Хорошо, мне удалось разобраться.

Оглядываясь назад, это была довольно очевидная ошибка, но странное поведение интерфейса взаимодействия COM между VBA и C# затруднило его обнаружение.

В вызове VBA для C# среди аргументов была таблица синтаксиса, которая была определена как таблица int в C#. Этот аргумент был принят в ref.

В таком случае я ожидал бы, что VBA потерпит крах, сказав «неверный аргумент» или что-то в этом роде. Вместо этого, похоже, есть неявный перевод единственного числа в int, что делает возможным вызов C#. Затем, когда метод csharp заканчивается, VBA, похоже, не в состоянии понять аргумент, который он передал в ref, и этот измененный тип. Это вызывает ошибку 430.

Моя ранняя версия не имела этой ошибки и поэтому работала.

Мне нужно помнить, что VBA является очень слабо типизирован!

В любом случае, тайна решена!