Выполнить код .NET 3.0 из Office 2003

Я создал DLL в C # с использованием платформы .NET 3.0.

Ниже приведен код моей DLL

namespace CompanyName.Net { [Guid("F7075E8D-A6BD-4590-A3B5-7728C94E372F")] [ClassInterface(ClassInterfaceType.AutoDual)] [ProgId("CompanyName.Net.Webrequest")] public class WebRequest { public string Result { get; private set; } public string Url { get; set; } public string StatusDescription { get; private set; } public HttpStatusCode StatusCode { get; private set; } public WebRequest() { //explicit constructor } public string GetResponse(string url) { System.Net.WebRequest webreq = System.Net.WebRequest.Create(url); HttpWebResponse response = (HttpWebResponse) webreq.GetResponse(); // Store the status. StatusDescription = response.StatusDescription; StatusCode = response.StatusCode; // Get the stream containing content returned by the server. Stream dataStream = response.GetResponseStream(); // Open the stream using a StreamReader for easy access. StreamReader reader = new StreamReader(dataStream); // Read the content. Result = reader.ReadToEnd(); // Cleanup the streams and the response. reader.Close(); dataStream.Close(); response.Close(); //return the response return Result; } } } 

Я пытаюсь запустить этот код из кода VBA Office 2003. DLL была подписана с использованием подписи Visual Studio 2008 по умолчанию.

Мне удалось ссылаться на мою сборку, создав файл .TLB, используя

 regasm /tlb c:\CompanyName.Net.dll 

Но когда я хочу создать экземпляр объекта:

 Private Sub Command0_Click() Dim o As Object Set o = CreateObject("CompanyName.Net.WebRequest") Dim s As String s = o.GetResponse("http://www.google.be") MsgBox s End Sub 

Я получаю следующую ошибку:

Компонент ActiveX не может создать объект

Что я делаю неправильно?

Машина, с которой я тестирую, установила .NET для платформы .NET 3.5.

Хорошо, после некоторых довольно хороших идей от Thorsten Dittmar я наконец получил эту вещь, чтобы работать. Некоторые вещи, которые возникли во время нашей дискуссии и другие вещи, которые я нашел в Интернете:

  1. Рамка .NET должна быть установлена ​​на целевой машине.
  2. .Net Настраиваемая поддержка программирования должна быть установлена ​​на целевой машине.
  3. В AssemblyInfo.cs убедитесь, что вы установили

    [assembly: ComVisible ( true )]

  4. Как заметил Торстен, вам нужно иметь безкоммертный публичный конструктор в вашем classе .Net.

  5. Обязательно проверьте «Регистрация для COM-взаимодействия» на вкладке «Сборка» на странице «Свойства» вашего проекта.
  6. Обязательно подпишите свой проект, используя вкладку «Подписание» на странице «Свойства» вашего проекта.
  7. Зарегистрируйте свою DLL на целевом компьютере, выполнив эту команду. Параметр / codebase, похоже, сделал трюк для меня. Путь к библиотеке типов (.tlb) или DLL не имеет значения. Вы можете найти regasm в C: \ Windows \ Microsoft.Net \ Framework \ v2.050727 \ RegAsm.exe

    regasm c: \ CompanyName.Net.dll /tlb:CompanyName.Net.tlb / codebase

  8. Справьте файл .tlb в редакторе VBA с помощью «Инструменты»> «Ссылки».

  9. Перетащите dll из C: \ в ваш GAC в C: \ Windows \ assembly \ (сначала я этого не понимал, но, видимо, Office должен найти вашу сборку.)

Это должно делать свое дело.

Я также обновил свой class Webrequest, добавив интерфейс для него, таким образом, поддержку IntelliSense в VB6 (что, к сожалению, не работает в VBA).

Вам нужен явный конструктор без параметров в вашем COM-classе. Измените определение своего classа на:

 namespace CompanyName.Net { [Guid("F7075E8D-A6BD-4590-A3B5-7728C94E372F")] [ClassInterface(ClassInterfaceType.AutoDual)] [ProgId("CompanyName.Net.Webrequest")] public class WebRequest { public string Result { get; private set; } public string Url { get; set; } public string StatusDescription { get; private set; } public HttpStatusCode StatusCode { get; private set; } public WebRequest() { } public string GetResponse(string url) { System.Net.WebRequest webreq = System.Net.WebRequest.Create(url); HttpWebResponse response = (HttpWebResponse) webreq.GetResponse(); // Store the status. StatusDescription = response.StatusDescription; StatusCode = response.StatusCode; // Get the stream containing content returned by the server. Stream dataStream = response.GetResponseStream(); // Open the stream using a StreamReader for easy access. StreamReader reader = new StreamReader(dataStream); // Read the content. Result = reader.ReadToEnd(); // Cleanup the streams and the response. reader.Close(); dataStream.Close(); response.Close(); //return the response return Result; } } } 

Это должно сработать.