none
Como Criar uma DLL COM+ (C#) RRS feed

  • Pergunta

  • Bom dia senhores,
    Estou precisando Criar uma DLL COM+ em C# que possa ser usada em C++, DELPHI..., alem de .NET. Procurei alguns arquivos mas não consegui criar nenhuma DLL, com os exemplos, que pudesse ser instalada com o "RegSvcs.exe" nem com o "RegAsm.exe". Gostaria o que tenho de adicionar na minha DLL (pois o codigo principal está pronto) para que eu pudesse utiliza-la em N linguagens.

    Att.,

    Murilo Duscov
    sexta-feira, 18 de janeiro de 2008 12:04

Respostas

Todas as Respostas

  •  

    mduscov,

     

    Não tenho um exemplo em C# agora mas em VB eu tenho este:

     

    Imports System.EnterpriseServices

    Imports System.Reflection

     

    <Assembly: ApplicationName("dotnetCOMService")>

    <Assembly: AssemblyKeyFile("..\..\bin\chave.snk")>

    <Assembly: ApplicationAccessControl(True)>

     

    Public Class COMService

    Inherits ServicedComponent

    ''' <summary>

    ''' Method to process business logic in COM context

    ''' </summary>

    ''' <returns>Status Message</returns>

    ''' <remarks></remarks>

    Public Function BusinessProcess() As String

    ' Required business logic could be implemented here

    Return "Hello World (Eu sou um serviced component .net)"

    End Function

    End Class

     

    Obs vc deve seguir estes passos:

     

    1 - Gerar Strong Name com o sn.exe

    2 - Registrar no COM+ com o RegSvcs.exe

     

    3 - registrar no GAC com o gacutil.exe

     

    Como é muito chato ficar fazendo isso toda hora, recomendo fortemente segiur o ótimo tutorial abaixo para automatizar todo o processo criando opções no menu do VS:

     

    http://www.bufaloinfo.com.br/artigos/Artigo0107.asp

    Eu fiz e já estou ussando via ASP.NET e via ASP Clássico

     

    Flw

     

    sexta-feira, 18 de janeiro de 2008 17:39
  •  mduscov wrote:
    Bom dia senhores,
    Estou precisando Criar uma DLL COM+ em C# que possa ser usada em C++, DELPHI..., alem de .NET. Procurei alguns arquivos mas não consegui criar nenhuma DLL, com os exemplos, que pudesse ser instalada com o "RegSvcs.exe" nem com o "RegAsm.exe". Gostaria o que tenho de adicionar na minha DLL (pois o codigo principal está pronto) para que eu pudesse utiliza-la em N linguagens.

    Att.,

    Murilo Duscov



    Bom pessoal estou revivendo o tópico por que surgiu outro problema, a classe que eu tenho q registrar no COM usa REMOTING, ou seja, é derivada da [MarshalByRefObject], por conta disso, o compilador não está deixando eu compilar o projeto pois diz q ela não pode derivar de [MarshalByRefObject] e de [ServicedComponent] ao mesmo tempo. Alguém sabe o que eu posso fazer?

    Att.,

    Murilo Duscov
    terça-feira, 29 de janeiro de 2008 12:28
  • Por qual motivo vc quer registrar a DLL no COM+ ?

     

    Se é apenas para acesso Remoto use apenas o .NET Remoting ou Web Services

     

    O .NET Remoting é mais rápido e o Web Serrvices é mais acessível(portável)

     

    O COM+ serve para serviços como:

     

    Obeject Pooling

    Just in Time

    CRM

    Queuing

    Transactions (no .net 2.0 não precisa mais do COM+ para transactions)

     

    Se vc não está usando esses serviços, então não use o COM+

    quinta-feira, 31 de janeiro de 2008 12:13
  • Eu tenho uma aplicação externa que verifica o que está acontecendo em meus serviços, eu utilizo o remoting para q serviços (meus) .NET possam conectar e receber os dados, mas a aplicação é externa, ela consegue se conectar por VBS em DLL COM pra ver isso ou ler arquivos de log (inviavel) tambem por VBS, logo me sobrou a opção COM, mas como utiliza remoting eu não estou conseguindo criar ela para COM. Eu qro saber um jeito de fazer com q ela utilizando o REMOTING tambem possa ser registrada como COM

    Att.,

    Murilo Duscov

     Skynyrd wrote:

    Por qual motivo vc quer registrar a DLL no COM+ ?

     

    Se é apenas para acesso Remoto use apenas o .NET Remoting ou Web Services

     

    O .NET Remoting é mais rápido e o Web Serrvices é mais acessível(portável)

     

    O COM+ serve para serviços como:

     

    Obeject Pooling

    Just in Time

    CRM

    Queuing

    Transactions (no .net 2.0 não precisa mais do COM+ para transactions)

     

    Se vc não está usando esses serviços, então não use o COM+

    quinta-feira, 31 de janeiro de 2008 12:29
  •  

    Bom, se vc quer saber se é possível usar Remoting e COM+ ao mesmo tempo. É possível sim.

     

    Aqui vai um exemplo em c#:

     

    //********************************************************************
    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Tcp;
    using System.Runtime.InteropServices;
    using System.EnterpriseServices;

    namespace COMPlusRemotingTest
    {
    public interface IRemotingTest
    {
      void Configure();
      bool Ping();
    }

    [Transaction(TransactionOption.Required)]
     [Synchronization(SynchronizationOption.Required)]
    [ClassInterface(ClassInterfaceType.None)]
    public class CRemotingTest : ServicedComponent,IRemotingTest
    {
      public CRemotingTest()
      {
      }

      public void Configure()
      {
       TcpChannel lchaTCPChannel = new  TcpChannel();
       ChannelServices.RegisterChannel(lchaTCPChannel);

       RemotingConfiguration.RegisterWellKnownClientType(typeof(IRemotingTest),"");

       System.Diagnostics.EventLog.WriteEntry("",RemotingConfiguration.GetRegisteredWellKnownClientTypes).Length.ToString());

      
      public bool Ping()
      {
       return true;
      }
    }
    }

     

    quinta-feira, 31 de janeiro de 2008 13:48
  • Ainda não é, o problema é o seguinte

    //********************************************************************

    class XPTO : ServicedComponent,MarshalByRefObject
    {}

    //********************************************************************

    é a minha classe de REMOTING servir como DLL COM, essa derivação acima o compilador não deixa o q eu qro saber eh se tem como faze-la de outra forma...

    Att.,

    Murilo Duscov


     Skynyrd wrote:

     

    Bom, se vc quer saber se é possível usar Remoting e COM+ ao mesmo tempo. É possível sim.

     

    Aqui vai um exemplo em c#:

     

    //********************************************************************
    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Tcp;
    using System.Runtime.InteropServices;
    using System.EnterpriseServices;

    namespace COMPlusRemotingTest
    {
    public interface IRemotingTest
    {
      void Configure();
      bool Ping();
    }

    [Transaction(TransactionOption.Required)]
     [Synchronization(SynchronizationOption.Required)]
    [ClassInterface(ClassInterfaceType.None)]
    public class CRemotingTest : ServicedComponent,IRemotingTest
    {
      public CRemotingTest()
      {
      }

      public void Configure()
      {
       TcpChannel lchaTCPChannel = new  TcpChannel();
       ChannelServices.RegisterChannel(lchaTCPChannel);

       RemotingConfiguration.RegisterWellKnownClientType(typeof(IRemotingTest),"");

       System.Diagnostics.EventLog.WriteEntry("",RemotingConfiguration.GetRegisteredWellKnownClientTypes).Length.ToString());

      
      public bool Ping()
      {
       return true;
      }
    }
    }

     

    quinta-feira, 31 de janeiro de 2008 14:06
  • Murilo,

     

    A classe ServicedComponent deriva de MarshalByRefObject então se sua classe derivar de ServicedComponent automáticamente estará derivando de MarshalByRefObject

     

    http://msdn2.microsoft.com/en-us/library/system.enterpriseservices.servicedcomponent(VS.80).aspx

     

    http://forums.asp.net/t/1213653.aspx

     

    Boa sorte

     

    sexta-feira, 1 de fevereiro de 2008 10:32