studio - ¿Cómo convertir una biblioteca de clases C#bastante simple en un objeto COM?
programa para el préstamo de libros en una biblioteca c# (3)
No, eso (estático / no ctor) no es verdad. Todo lo contrario, de hecho, ¡ya que COM necesitará crear una instancia! Simplemente necesita hacer visible la clase COM. Principalmente, esto solo agrega algunos atributos y los registra como COM dll (regasm).
Este es mi problema: tengo que llamar a un servicio web con un encabezado seguro desde una página ASP clásica que devuelve un tipo de datos complejo. Por diversas razones relacionadas con una herramienta de terceros, tiene que ser ASP clásico. Decidimos que debería crear un dll externo para hacer esto, lo cual hice (en c #) para que devuelva un conjunto de datos (algo que ASP puede entender). Sin embargo, ahora necesito exponer esa función a la página ASP. Debido a que este es un ASP clásico, creo que la única manera directa de hacerlo es exponiendo esta biblioteca de clase como un objeto COM. Necesito saber la manera más fácil y sucia de lograr esta tarea. ¿Qué tengo que hacer con mi dll?
Nunca he creado un objeto COM antes solo usado. Alguien dijo que mi clase tiene que ser estática y no puedo tener un constructor. ¿Es esto cierto? ¿Alguien puede diseñar los pasos para mí?
¡AYUDA! (o:
Editar: Este problema específico ahora está resuelto, sin embargo, como Robert Rossney señaló que no puedo hacer nada con el DataSet en ASP clásico. Esto me ha llevado a publicar aquí una segunda pregunta sobre la implementación de XmlTextWriter: Robert, si ves esto, creo que realmente podrías ayudar.
Alguien dijo que mi clase tiene que ser estática y no puedo tener un constructor. ¿Es esto cierto?
Una clase COM necesita tener un constructor predeterminado, que será utilizado por los clientes cuando llaman a CoCreateInstance. Después de crear el objeto, puede establecer propiedades en él o llamar a otros métodos.
Esto es similar a la forma en que .Net trata los objetos serializables ... lo construye con un constructor predeterminado, luego establece todas sus propiedades. (Si le gusta RAII, no tiene suerte con COM y .Net. Superarlo;)
En cuanto al comentario estático, no, eso no es cierto, como señaló Marc.
Crear una clase que devuelva un DataSet no es tan difícil:
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;
}
}
}
Deberá marcar el recuadro "Registrarse para la interoperabilidad COM" en las propiedades del proyecto, también deberá firmar el ensamblaje, y deberá asegurarse de que el usuario de IIS pueda acceder al directorio bin/Debug
.
Una vez que haya hecho esto, puede crear una instancia de ASP muy bien:
<%
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
%>
Y aquí estarás triste. Mientras que el método que devuelve un DataSet es visible para COM, ninguna de las propiedades o métodos del DataSet son.