Преобразование довольно простой библиотеки классов C # в COM-объект? - PullRequest
2 голосов
/ 15 ноября 2008

Вот моя проблема: мне нужно вызвать веб-сервис с защищенным заголовком с классической страницы ASP, которая возвращает сложный тип данных. По разным причинам относительно стороннего инструмента это должен быть классический ASP. Мы решили, что я должен создать внешнюю dll для этого - что я и сделал (в c #), чтобы он возвращал набор данных (что-то ASP может понять). Однако теперь мне нужно представить эту функцию на странице ASP. Поскольку это классический ASP, я думаю, что единственный простой способ сделать это - представить эту библиотеку классов как объект COM. Мне нужно знать самый простой и простой способ выполнить эту задачу. Что мне делать с моей DLL?

Я никогда не создавал COM-объект, а только использовал. Кто-то сказал, что мой класс должен быть статическим, и у меня не может быть конструктора. Это правда? Может ли кто-нибудь сделать шаги для меня?

HELP! (О:

Редактировать: Эта конкретная проблема теперь решена, однако, как заметил Роберт Россни, я ничего не могу сделать с DataSet в классическом ASP. Это заставило меня опубликовать второй вопрос здесь относительно реализации XmlTextWriter - Роберт, если вы увидите это, я думаю, вы действительно могли бы помочь!

Ответы [ 3 ]

2 голосов
/ 15 ноября 2008

Создание класса, который возвращает DataSet, не так сложно:

using System;
using System.Data;
using System.Runtime.InteropServices;

namespace COMTest
{
   [Guid("AC4C4347-27EA-4735-B9F2-CF672B4CBB4A")]
   [ComVisible(true)]
   public interface ICOMTest
   {
       [ComVisible(true)]
       DataSet GetDataSet();
   }

   [Guid("CB733AB1-9DFC-437d-A769-203DD7282A8C")]
   [ProgId("COMTest.COMTest")]
   [ComVisible(true)]
   public class COMTest : ICOMTest
   {
       public DataSet GetDataSet()
       {
           DataSet ds = new DataSet("COMTest");
           return ds;
       }
   }

}

Вам необходимо установить флажок «Зарегистрироваться для COM-взаимодействия» в свойствах проекта, также необходимо подписать сборку и убедиться, что пользователь IIS может получить доступ к bin\Debug каталог.

Как только вы это сделаете, вы можете просто создать экземпляр из ASP:

<%
Dim o
Set o = Server.CreateObject("COMTest.COMTest")
Response.Write("Server.CreateObject worked.")
Response.Write("<br/>")
Dim ds
Set ds = o.GetDataSet()
If Not ds is Nothing Then
  Response.Write("o.GetDataSet returned an object.  Can we use it?")
  Response.Write("<br/>")
  Response.Write("We have a DataSet, and its DataSetName is: ")
  Response.Write(ds.DataSetName)
End If
%>

И здесь тебе будет грустно. Поскольку метод, возвращающий DataSet, является видимым для COM, ни один из свойств или методов DataSet не является.

2 голосов
/ 15 ноября 2008

Нет, это (статический / без ctor) не соответствует действительности. Наоборот, на самом деле, поскольку COM нужно будет создать экземпляр! Вам просто нужно сделать класс COM видимым. В основном это просто добавление некоторых атрибутов и регистрация их как COM dll (regasm).

http://msdn.microsoft.com/en-us/library/zsfww439.aspx

1 голос
/ 15 ноября 2008

Кто-то сказал, что мой класс должен быть статический и у меня не может быть конструктора. Это правда?

Класс COM должен иметь конструктор по умолчанию, который будет использоваться клиентами при вызове CoCreateInstance. После создания объекта вы можете установить для него свойства или вызвать другие методы.

Это похоже на то, как .Net обрабатывает сериализуемые объекты ... вы создаете его с помощью конструктора по умолчанию, а затем устанавливаете все его свойства. (Если вам нравится RAII, вам не повезло и с COM, и с .Net. Преодолейте это;)

Что касается статического комментария, нет, это не так, как отметил Марк.

...