Как использовать класс С# в Excel VBA?

У меня есть автономные приложения С#, которые делают что-то конкретное (слушает порт TCP и произносят все строки, которые поступают к нему через речевой синтезатор). Как я могу сделать класс С# видимым для программы VBA, так же, как и другие "Ссылки"? Я был бы признателен за короткий и чистый пример. Я изо всех сил пытаюсь найти кого-то из них.

Если есть некоторые ошибки, связанные с взаимодействием С# ↔ vba, мне также хотелось бы узнать об этом.

Вот код С#. Я создаю библиотеку классов с настройкой "Регистрация для COM-взаимодействия". Когда я добавляю полученный файл .tlb в список ссылок VBA, я ожидаю увидеть библиотеку SayCom, которая имеет класс SayCom с двумя методами, квадратом и getCount. Я этого не вижу. Что мне не хватает?

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Runtime.InteropServices;
 [assembly: CLSCompliant(true)]
 namespace SayCom
 {
 [CLSCompliant(true)]
 [ComVisible(true)]
 public class SayCom
 {
 int count;
 public SayCom()
 {
 count = 0;
 }
 [ComVisible(true)]
 public int square(int x)
 {
 ++count;
 return x * x;
 }
 [ComVisible(true)]
 public int getCount()
 {
 return count;
 }
 }
 }
2 ответа

Это работает для меня

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ClassLibrary1
{
 [Guid("BBF87E31-77E2-46B6-8093-1689A144BFC6")]
 [ComVisible(true)]
 public interface MyMiniSubs
 {
 int square(int x);
 int getCount();
 }
 [Guid("BBF87E31-77E2-46B6-8093-1689A144BFC7")]
 [ClassInterface(ClassInterfaceType.None)]
 public class Class1 : MyMiniSubs
 {
 int count;
 public Class1()
 {
 count = 0;
 }
 [ComVisible(true)]
 public int square(int x)
 {
 ++count;
 return x * x;
 }
 [ComVisible(true)]
 public int getCount()
 {
 return count;
 }
 }
}


Единственная "gotcha", насколько мне известно, заключается в том, что ваш код С# должен быть совместимым с CLS. Вы должны следовать инструкциям здесь, чтобы импортировать свой код С# в виде .dll в ваше приложение VB. Отказ от ответственности: я сам не пробовал.

EDIT: Здесь более официальная ссылка MSDN, в которой говорится о вызовах функций из .dll.

licensed under cc by-sa 3.0 with attribution.