2015-11-25 2 views
0

Я создал библиотеку библиотеки классов и завернул ее, но когда я использую ее в VBA (Excel), у нее нет методов. Все хорошо из другой программы .NET:tlb не генерирует методы

Это мой код:

namespace NeilLibrary 
    { 
     public interface INeilTest 
     { 
      string DoMethodReturn(string name); 
      string DoMethodOut(string name, out string name2, out bool isPrev); 
     } 
     [Guid("BA7CC0F2-9C07-4EF9-B799-18D317B7E293")] 
     [ComVisible(true)] 
     public class NeilTest 
     { 
      public NeilTest() { } 
      [ComVisible(true)] 
      public string DoMethodReturn(string name) 
      { 
       return "name: " + name; 
      } 

      [ComVisible(true)] 
      public string DoMethodOut(string name, out string name2, out bool isPrev) 
      { 
       name2 = "New Value"; 
       isPrev = true; 
       return "Name: " + name; 
      } 
     }  } 

я построил его с COM включен в сборку, и я побежал следующую команду:

regasm.exe NeilLibrary.dll /tlb:neil.tlb 

который работал хорошо. В Excel я импортировал tlb и он появляется в браузере объектов, поэтому он создан нормально, но методов нет. Интерфейс показан, хотя, с его методами, но это не очень полезно.

Может кто-нибудь помочь пожалуйста.

Я добавил конструктор no-arg, потому что я где-то читал кого-то с подобной проблемой, пришлось это сделать.

+0

Вы пробовали [это] (http://stackoverflow.com/q/11570262/1188513) и [это] (http://stackoverflow.com/a/29783710/1188513)? –

+0

Прочтите мой ответ на другое сообщение ..... http: //stackoverflow.com/questions/33923624/cant-add-a-reference-to-the-specified-file/33923711? Noredirect = 1 # comment55610787_33923711 –

+0

У типов COM нет «конструкторов», поэтому вы не можете выставлять управляемый тип COM, если он имеет только конструктор с параметрами - на самом деле вы * можете *, но ваш COM-клиент не сможет его создать. ... и до того, как вы нажмете эту стену, вы также не можете выставлять общие типы для COM. =) –

ответ

1

О, я вижу разницу теперь вы вывесили ваш код ....

Вам нужно сделать функции, которые вы хотите использовать COM Visible. Вы можете сделать это в файл свойств или выше вы класса, как это

[ComVisible(true)] 
[Guid("blah")] 
public class ConnectionUtilities: IConnectionUtilities 
{ 
} 

Попробуйте сделать всю сборку ComVisible, перейдя в свойства-> AssemblyInfo.cs вашего C# проекта и объявить, как это:

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components. If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type. 
[assembly: ComVisible(true)] 

// The following GUID is for the ID of the typelib if this project is exposed to COM 
[assembly: Guid("0a2d43c9-da5e-4a59-8006-ff131b33d86c")] 
+0

спасибо, я обновил свой код выше, но до сих пор нет радости. Нужен ли интерфейс и интерфейс, настройка и т. Д.? tbh, я думал, что это будет простая работа, но я не могу найти ничего, что поможет вам в этом. –

+0

@NeilWalker Вы сделали свои методы com видимыми, но не своим классом. Вам не нужны никакие другие вещи. –

+0

Все еще не работает. Ваши детали сборки уже есть, я вижу класс нормально, просто не методы, и я добавил интерфейс, и это видно с помощью методов в VBA, а не класса. Спасибо за ваше терпение :) –

1

Во-первых, спасибо за помощь каждого.

Решение было довольно простым в конце. Мне просто пришлось добавить '/ codebase' в regasm.exe (или подписать его и добавить через gacutil).

Кроме того, я не проверял любую другую перестановку, но это единственный способ, которым это работает для меня:

namespace NeilLibrary 
    { 
     [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
     public interface INeilTest 
     { 
      [DispId(1)] 
      string DoMethodReturn(string name); 
      [DispId(2)] 
      string DoMethodOut(string name, out string name2, out bool isPrev); 
     } 

     [Guid("BA7CC0F2-9C07-4EF9-B799-18D317B7E293")] 
     [ComVisible(true)] 
     [ClassInterface(ClassInterfaceType.None)] 
     [ProgId("NeilLibrary.NeilTest")] 
     public class NeilTest : INeilTest 
     { 
      [ComVisible(true)] 
      public string DoMethodReturn(string name) 
      { 
       return "name: " + name; 
      } 

      [ComVisible(true)] 
      public string DoMethodOut(string name, out string name2, out bool isPrev) 
      { 
       name2 = "New Value"; 
       isPrev = true; 
       return "Name: " + name; 
      } 
     } 
    } 
Смежные вопросы