ID do artigo: 307713 - Última revisão: quinta-feira, 24 de abril de 2003 - Revisão: 1.4

COMO: Gravar um empacotador personalizado de interoperação de COM usando o Visual translation from VPE for Csharp .NET

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

Este artigo descreve como criar um empacotador personalizado que mapeia uma interface não gerenciada específica para uma interface gerenciada e vice-versa. O empacotador personalizado que é implementado neste artigo permite que clientes nativos para ver qualquer servidor gerenciado, expondo a interface não gerenciada que compreendam clientes nativos. Também, o empacotador personalizado permite que os clientes gerenciados de um servidor COM (Component Object Model) nativo para ver a interface que é exposta pelo servidor COM como uma interface gerenciada.

Back to the top

Mais Informações

Este artigo discute o contexto onde é necessário o empacotador personalizado. Este artigo fornece dois cenários diferentes.

cenário 1

O primeiro cenário discute empacotamento personalizado de um cliente .NET em um servidor COM. Nesse cenário, você deve ter:
  • Um servidor COM que implementa o IUnmanagedServer interface.
  • Um IUnmanagedServer que tenha um único método chamado UnmanagedServerMethod . Este método requer um único parâmetro do tipo IUnmanaged como entrada.
  • Um cliente .NET que possui uma instância de digite IManaged.
  • Um cliente .NET que passa a instância IManaged para o UnmanagedServerMethod de servidor COM.
O exemplo de código que segue é um trecho do IUnmanaged interface:
interface IUnmanaged : IUnknown
{
	HRESULT UnmanagedMethod([out, retval] LONG *RetVal);
};
a interface gerenciada (IManaged) que é semanticamente semelhante da interface não gerenciada (IUnmanaged) é:
public interface IManaged
{
	long ManagedMethod();
}

cenário 2

O segundo cenário discute empacotamento personalizado de um cliente COM em um servidor .NET. Nesse cenário, você deve ter:
  • Um servidor .NET que implementa um único método chamado ManagedServerMethod . Este método requer um único parâmetro do tipo IManaged como entrada.
  • Um cliente COM que tenha uma instância de digite IUnmanaged.
  • Um cliente COM que passa a instância IUnmanaged para o ManagedServerMethod do .NET server.
Quando você tenta mapear tipos diferentes de semanticamente semelhantes, você deve criar uma classe de invólucro. Uma classe de wrapper contém uma instância de um tipo mas expõe a interface para outro tipo. Os tipos que são mapeados devem ser semelhantes para que a classe de wrapper pode manter a semântica que é definida para as interfaces. Este artigo descreve como usar uma classe wrapper para o cenário em que o cliente .NET acessa o servidor COM. Uma classe de invólucro que é chamada ManagedIUnmanaged encapsula uma instância de IManaged mas expõe a interface IUnmanaged.

Da mesma forma, quando o cliente COM acessa .NET server, uma classe de invólucro que é chamada ComUnmanged encapsula uma instância de IUnmanaged mas expõe a interface IManaged.

O problema de mapeamento de uma interface gerenciada para uma interface não gerenciada tem uma solução. A solução é usar classes de wrapper. O empacotador personalizado automatiza e oculta quando o wrapper é criado para o tipo empacotado de umanaged para o domínio gerenciado e vice-versa.

Examine a classe de fluxo e a interface COM IStream. Você pode ver que mecanismos de conversão são necessárias. Os mecanismos de conversão permite que um objeto não gerenciado para implementar a certos requisitos de interface devem ser mapeados para um objeto de invólucro. Esse objeto wrapper, em seguida, expõe um conjunto diferente de interfaces. A Classe .NET fluxo é semanticamente semelhante à interface COM IStream. As abstrações fornecidas a classe de fluxo e a interface COM IStream são semelhantes. IStream e Stream permitem ler, gravar e procurando por um buffer. Uma classe .NET que obtém uma instância da classe Stream logicamente pode ser passada uma instância do objeto COM que implementa a interface IStream. Para fazer isso, o .NET Framework deve fornecer um mecanismo onde um objeto de invólucro da classe de fluxo pode ser criado. Isso em seguida, redireciona o método de classe de fluxo que chama o objeto IStream COM incorporado. O mecanismo que permite a ocorrência de uma conversão é a classe CustomMarshaler que é fornecida no .NET Framework.

Em ambos os cenários, o empacotador personalizado é construído dependendo da direção que o empacotamento é executado. Se o empacotamento é executado do cliente nativo para um servidor gerenciado, você deverá definir o empacotador personalizado para empacotar do nativo ao domínio gerenciado. Se o empacotamento personalizado é empacotado em ambas as direções, você deve combinar a definição de empacotador personalizado conforme descrito em ambos os cenários.

Back to the top

Empacotamento personalizado em um cliente .NET a um servidor COM

Passos para criar um servidor COM de ATL

Esta seção mostra como criar um servidor COM ATL que implementa a interface IUnmanagedServer.
  1. Abra o Microsoft Visual Studio .NET .
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. Na caixa de diálogo New Project , clique em Projetos do Visual c++ em Project Types e clique em Projeto ATL em modelos .
  4. Na caixa de texto nome , digite ComServer .
  5. Clique em OK .
  6. Na caixa de diálogo do Assistente , clique na guia Configurações do aplicativo .
  7. Clique para desmarcar a caixa de seleção atribuída e em seguida, clique em Concluir .
  8. No Solution Explorer , clique com o botão direito no nó ComServer (projeto) , aponte para Adicionar e, em seguida, clique em Add Class .
  9. Na caixa de diálogo Add Class , clique em ATL Simple Object em modelos e em seguida, clique em Abrir .
  10. Na caixa de diálogo ATL Simple Object Wizard , digite UnmanagedServer na caixa de texto nome curto e, em seguida, clique em Concluir .
  11. No Solution Explorer , expanda Arquivos de origem .
  12. Clique duas vezes em ComServer.idl para abrir o arquivo .idl em um editor. Adicionar a seguinte definição de interface para o arquivo .idl.
    [
    	object,
    	uuid(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX),
    	helpstring("IUnmanaged Interface"),
    	pointer_default(unique)
    ]
    interface IUnmanaged : IUnknown
    {
    	HRESULT UnmanagedMethod([out, retval] LONG *RetVal);
    };
    substituir o conteúdo do atributo uuid com o GUID é gerado a partir da ferramenta guidgen . Na biblioteca, adicione a interface IUnmanaged conforme mostrado no código anterior. Isso expõe a interface por meio da biblioteca de tipos é gerada. Adicionar o código a seguir à instrução biblioteca no arquivo .idl:
    library ComServerLib
    {
    	importlib("stdole2.tlb");
    	//Add the following line to the idl file.
    	interface IUnmanaged;
    	...
    };
    
  13. No modo de exibição Class , expanda ComServer .
  14. Clique com o botão direito do mouse IUnmanagedServer , aponte para Add e, em seguida, clique em Adicionar método .
  15. Na caixa de texto Method Name , digite UnmanagedServerMethod .
  16. Clique para selecionar os atributos de parâmetro de caixa de seleção.
  17. Na caixa de combinação tipo de parâmetro , digite IUnmanaged 1 .
  18. Na caixa de texto parâmetro , digite não gerenciado e, em seguida, clique em Adicionar .
  19. Clique em Concluir .
  20. No Solution Explorer , clique duas vezes em UnmanagedServer.cpp .
  21. Substitua o código padrão que é gerado para o método CUnmanagedServer::UnmanagedServerMethod com o código que segue: dados
    LONG data;
    HRESULT hr;
    hr = unmanaged->UnmanagedMethod(&data);
    if(FAILED(hr))
    	return hr;
    printf("The output of the IUnmanaged::UnmanagedMethod is : %d", data);
    return S_OK;
  22. No menu Build , clique em Build Solution para criar o aplicativo de servidor COM ATL.
Back to the top

Passos para criar um cliente .NET

Esta seção mostra como criar um cliente .NET que acessa o servidor COM e, em seguida, passa a UnmanagedMethod do servidor com uma instância de IManaged:
  1. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  2. Na caixa de diálogo New Project , clique em projetos do Visual translation from VPE for Csharp em Project Types e clique em Aplicativo de console em modelos .
  3. Clique para selecionar a opção de Adicionar a solução e, em seguida, clique em OK .
  4. No Solution Explorer , expanda ConsoleApplication1 , clique com o botão direito do mouse em References e em seguida, clique em Add Reference .
  5. Na caixa de diálogo Add Reference , clique na guia COM .
  6. Clique em Biblioteca de tipos de 1.0 ComServer em Nome do componente e clique em Selecionar .
  7. Clique em OK .
  8. Substitua o código padrão de Class1.cs com o código que segue:
    using System;
    using System.Runtime.InteropServices;
    
    public interface IManaged
    {
    	long ManagedMethod();
    }
    
    public class ManagedImplementation : IManaged
    {
    	public long ManagedMethod()
    	{
    		return 200;
    	}
    }
    
    class Class1
    {
    	static void Main(string[] args)	
    	{
    		comserverLib.IUnmanagedServer server = new comserverLib.UnmanagedServerClass();
    		IManaged managed = new ManagedImplementation();
    		server.UnmanagedServerMethod(managed);
    	}
    }
    
Back to the top

Passos para criar um wrapper

Esta seção mostra como criar uma classe de wrapper que envolve uma instância do tipo IManaged mas que expõe a interface IUnmanaged.

Para criar uma classe de invólucro, execute essas etapas:
  1. Adicione o código que segue a Class1.cs:
    [
    	ComImport,
    	Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"),
    	InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)
    ]
    public interface UCOMIUnmanaged
    {
    	long UnmanagedMethod();
    }
    
    public class ManagedIUnmanaged : UCOMIUnmanaged
    {
    	IManaged managedObj;
    
    	public ManagedIUnmanaged(IManaged managedObj)
    	{
    		if(managedObj != null)
    			this.managedObj = managedObj;
    		else
    			throw new ArgumentNullException("The instance of IManaged is null.");
    	}
    
    	public long UnmanagedMethod()
    	{
    		return  managedObj.ManagedMethod();
    	}
    }
    
    substituir o conteúdo do atributo GUID com o conteúdo do atributo uuid . O atributo uuid é gerado para a interface IUnmanaged no arquivo ComServer.idl.

Back to the top

Passos para criar um empacotador personalizado

Esta seção mostra como criar um empacotador personalizado que mapeia uma interface gerenciada (IManaged) para uma interface não gerenciada (IUnmanaged):

O empacotador personalizado deve implementar a interface ICustomMarshaler. O método MarshalNativeToManaged é chamado quando uma interface não gerenciada está mapeada para uma interface gerenciada. Porque o cenário atual empacota do gerenciado para o domínio nativo, a implementação atual do método MarshalNativeToManaged retorna nula. O método MarshalManagedToNative encapsula o objeto nativo em um objeto de invólucro ( ManagedIUnmanaged ) que foi definido na seção anterior. O método MarshalManagedToNative é chamado quando uma interface gerenciada está mapeada para uma interface não gerenciada. O método CleanUpNativeData é chamado quando o objeto que está associado com a interface nativa for lançado.

Da mesma forma, o método CleanUpManagedData é chamado quando o objeto que está associado com a interface gerenciada é liberado. Porque o objeto gerenciado é coletados pelo lixo, a implementação para o método CleanUpManagedData está vazia.

O método GetNativeDataSize retorna -1 .

Embora o método GetInstance não está definido para a interface ICustomMarshaler, você deve definir o método GetInstance estático que retorna uma instância de ICustomMarshaler . Esse método estático é chamado pelo runtime do .NET para criar uma instância do empacotador personalizado.
  1. Add the code that follows to Class1.cs:
    public class SampleMarshaler : ICustomMarshaler
    {
    	static SampleMarshaler marshaler;
    
    	public object MarshalNativeToManaged(IntPtr pNativeData)
    	{
    		return null;
    	}
    	
    	public IntPtr MarshalManagedToNative(object managedObj)
    	{
    		if(managedObj == null)
    			return IntPtr.Zero;
    		if(!(managedObj is IManaged))
    			throw new MarshalDirectiveException("This custom marshaler must be used on a IManaged derived type.");
    
    	ManagedIUnmanaged customObject = new ManagedIUnmanaged((IManaged)managedObj);
    	return Marshal.GetComInterfaceForObject(customObject, typeof(UCOMIUnmanaged));
    	}
    
    	public void CleanUpNativeData(IntPtr pNativeData)
    	{
    		Marshal.Release(pNativeData);
    	}
    
    	public void CleanUpManagedData(object managedObj)
    	{
    
    	}
    
    	public int GetNativeDataSize()
    	{
    		return -1;
    	}
    
    	public static ICustomMarshaler GetInstance(string cookie)
    	{
    		if(marshaler == null)
    			return marshaler = new SampleMarshaler();
    		return marshaler;
    	}
    }
  2. Associe o empacotador personalizado com o empacotamento da instância da interface IManaged a uma instância da interface IUnmanaged. Adicione o código que segue a Class1.cs para associar o empacotador personalizado:
    [
    	ComImport,
    	Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"),
    	InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)
    ]
    public interface UCOMIUnmanagedServer
    {
    	void UnmanagedServerMethod(
    		[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(SampleMarshaler)), In]
    		object unmanaged);
    }
    é O GUID que você especificar com o atributo GUID o mesmo que o atributo de uuid que é especificado para a interface IUnmanagedServer em .IDL para o servidor COM.
  3. Modifique o método Main de Class1 em Class1.cs da seguinte forma:
    static void Main(string[] args)
    {
    	UCOMIUnmanagedServer server = (UCOMIUnmanagedServer)new ComServerLib.UnmanagedServerClass();
    	IManaged managed = new ManagedImplementation();
    	server.UnmanagedServerMethod(managed);
    }
    quando o cliente não gerenciado chama o servidor não gerenciado, o cliente não gerenciado passa uma instância de um objeto gerenciado para o servidor não gerenciado. O objeto gerenciado é personalizado empacotada para um objeto que expõe a interface não gerenciada como esperada pelo servidor COM.
  4. No menu Build , clique em Build Solution .
  5. No Solution Explorer , clique no nó de projeto ConsoleApplication1 com o botão direito do mouse e clique em Set as StartUp Project .
  6. No menu Debug , clique em Iniciar .
Back to the top

Empacotamento personalizado em um cliente COM a um servidor .NET

O cenário que se segue mostra empacotamento personalizado como é feito de um cliente COM para um servidor .NET.

Passos para criar um cliente COM

Esta seção mostra como criar um componente COM ATL que implementa a interface IManaged:
  1. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  2. Clique em Projetos do Visual c++ em Tipos de projeto e clique em Projeto ATL em modelos .
  3. Na caixa de texto nome , digite ComComponent e, em seguida, clique em OK .
  4. Na caixa de diálogo ATL Project Wizard , clique na guia Configurações do aplicativo .
  5. Clique para desmarcar a caixa de seleção atribuída e em seguida, clique em Concluir .
  6. No Solution Explorer , clique com o botão direito ComComponent (projeto) , aponte para Adicionar e, em seguida, clique em Add Class .
  7. Na caixa de diálogo Add Class , clique em ATL Simple Object em modelos e em seguida, clique em Abrir .
  8. Na caixa de diálogo ATL Simple Object Wizard , digite Unmanaged o nome curto texto caixa e clique em Concluir .
  9. No Class View , expanda ComComponent , clique com o botão direito do mouse IUnmanaged , aponte para Add e, em seguida, clique em Adicionar método .
  10. Na caixa de diálogo Assistente para Adicionar método , digite UnmanagedMethod na caixa de texto Nome do método .
  11. Selecione LONG 1 da lista em tipo de parâmetro .
  12. Clique para selecionar retval em atributos de parâmetro e, em seguida, digite lRetVal na caixa de texto nome do parâmetro .
  13. Clique em Adicionar e clique em Concluir .
  14. No Solution Explorer , clique duas vezes em Unmanaged.cpp para abrir o arquivo.
  15. Substitua o código padrão para CUnmanaged::UnmanagedMethod com o código que segue:
    *lRetVal = 300;
    return S_OK;
    
  16. No menu Build , clique em Build Solution para criar o componente COM.
Back to the top

Etapas para criar um servidor .NET

Esta seção mostra como criar um servidor .NET que implementa um único método chamado ManagedServerMethod . ManagedServerMethod obtém uma instância do tipo IManaged:
  1. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  2. Clique em projetos do Visual translation from VPE for Csharp em Tipos de projeto e clique em Class Library em modelos .
  3. Clique para selecionar a opção de Adicionar a solução e, em seguida, clique em OK .
  4. No arquivo Class1.cs gerado por padrão, substitua o código padrão com o código que segue:
    using System;
    using System.Runtime.InteropServices;
    
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IManaged
    {
    	long ManagedMethod();
    }
    
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class ManagedServer
    {
    	public void ManagedServerMethod(IManaged managed)
    	{
    		Console.WriteLine("The output of IManaged.ManagedMethod is : {0}", managed.ManagedMethod());
    	}
    }
    
Back to the top

Passos para criar um wrapper

Esta seção mostra como criar uma classe de wrapper que envolve uma instância do tipo IUnmanaged mas que expõe a interface IManaged:
  1. No Solution Explorer , expanda ClassLibrary1 .
  2. Na ClassLibrary1 , clique com o botão direito do mouse em References e clique em Add Reference .
  3. Na caixa de diálogo Add Reference , clique na guia COM .
  4. Clique em biblioteca de tipos ComComponent 1.0 em nome do componente .
  5. Clique em Selecionar e clique em OK .
  6. No arquivo Class1.cs, adicione código a seguir:
    [ComVisible(false)]
    public class ComUnmanaged : IManaged
    {
    	ComComponentLib.IUnmanaged unmanaged;
    
    	public ComUnmanaged(ComComponentLib.IUnmanaged unmanaged)
    	{
    		if(unmanaged != null)
    			this.unmanaged = unmanaged;
    		else
    			throw new ArgumentNullException("NULL");
    	}
    
    	public long ManagedMethod()
    	{
    		return unmanaged.UnmanagedMethod();
    	}
    }
    	
Back to the top

Passos para criar um empacotador personalizado

Esta seção mostra como criar um empacotador personalizado que mapeia uma interface não gerenciada (IUnmanaged) para uma interface gerenciada (IManaged):

O empacotador personalizado deve implementar a interface ICustomMarshaler. O método MarshalManagedToNative é chamado quando uma interface gerenciada está mapeada para uma interface não gerenciada. Como o cenário atual empacota de não gerenciado para o domínio gerenciado, a implementação atual do método MarshalManagedToNative retorna IntPtr.Zero .

O método MarshalNativeToManaged encapsula o objeto nativo em um objeto de invólucro ( ComUnmanaged ) que foi definido na seção anterior. O método MarshalNativeToManaged é chamado quando uma interface não gerenciada está mapeada para uma interface gerenciada.

O método CleanUpNativeData é chamado quando o objeto que está associado com a interface nativa for lançado.

Da mesma forma, o método CleanUpManagedData é chamado quando o objeto que está associado com a interface gerenciada é liberado. Porque o objeto gerenciado é coletados pelo lixo, a implementação para o método CleanUpManagedData está vazia.

O método GetNativeDataSize retorna -1 .

Embora o método GetInstance não está definido para a interface ICustomMarshaler, você deve definir o método GetInstance estático que retorna uma instância de ICustomMarshaler. Esse método estático é chamado pelo runtime do .NET para criar uma instância do empacotador personalizado.
  1. Adicione o código que segue a Class1.cs:
    [ComVisible(false)]
    public class SampleMarshaler : ICustomMarshaler
    {
    	static SampleMarshaler marshaler;
    
    	public object MarshalNativeToManaged(IntPtr pNativeData)
    	{
    		if(pNativeData == IntPtr.Zero)
    			return null;
    
    		object rcw = Marshal.GetObjectForIUnknown(pNativeData);
    		if(!(rcw is ComComponentLib.IUnmanaged))
    			throw new ArgumentException("The object must implement IUnmanaged");
    
    		return new ComUnmanaged((ComComponentLib.IUnmanaged) rcw);
    	}
    
    	public IntPtr MarshalManagedToNative(object managedObj)
    	{
    		return IntPtr.Zero;
    	}
    
    	public void CleanUpNativeData(IntPtr pNativeData)
    	{
    		Marshal.Release(pNativeData);
    	}
    
    	public void CleanUpManagedData(object managedObj)
    	{
    
    	}
    
    	public int GetNativeDataSize()
    	{
    		return -1;
    	}
    
    	public static ICustomMarshaler GetInstance(string cookie)
    	{
    		if(marshaler == null)
    			return marshaler = new SampleMarshaler();
    		return marshaler;
    	}
    }
  2. Adicione MarshalAsAttribute para o parâmetro que é personalizado empacotado. Modificar o código para ManagedServerMethod da seguinte maneira:
    public void ManagedServerMethod(
    	[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(SampleMarshaler)), In]
    	IManaged managed)
    {
    	Console.WriteLine("The output of IManaged.ManagedMethod is : {0}", managed.ManagedMethod());
    }
  3. No menu Build , clique em Build Solution .
  4. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  5. Na caixa de diálogo New Project , clique em Projetos do Visual c++ em Project Types e clique em Projeto Win32 em modelos .
  6. Na caixa de texto nome , digite ComClient .
  7. Clique para selecionar a opção de Adicionar a solução e, em seguida, clique em OK .
  8. Na caixa de diálogo do Assistente de aplicativos Win32 , clique na guia Configurações do aplicativo .
  9. Clique para selecionar o Aplicativo de console opção sob a seção Application digite e clique em Concluir .
  10. No Solution Explorer , expanda ComClient e clique duas vezes em stdafx.h arquivo para abrir o arquivo. Adicione o código que segue para o arquivo:
    #import "ComComponent.tlb" no_namespace raw_interfaces_only named_guids
    #import "ClassLibrary1.tlb" no_namespace raw_interfaces_only named_guids
  11. No Solution Explorer , expanda ComClient e clique duas vezes no arquivo ComClient.cpp para abrir esse arquivo. Adicione o código que segue ao file:
    #include "stdafx.h"
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HRESULT hr;
    	IUnmanaged *unmanagedObj;
    	_ManagedServer *managedServer;
    
    	CoInitialize(NULL);
    	hr = CoCreateInstance(CLSID_Unmanaged, NULL, CLSCTX_INPROC_SERVER, IID_IUnmanaged, (LPVOID *)&unmanagedObj);
    	if(FAILED(hr))
    		goto Error;
    
    	hr = CoCreateInstance(CLSID_ManagedServer, NULL, CLSCTX_INPROC_SERVER, IID__ManagedServer, (LPVOID *)&managedServer);
    	if(FAILED(hr))
    		goto Error;
    
    	hr = managedServer->ManagedServerMethod(unmanagedObj);
    	if(FAILED(hr))
    		goto Error;
    
    	return 0;
    
    Error:
    	CoUninitialize();
    	return hr;
    }
  12. Para gerar o ClassLibrary1.tlb, digite o comando seguinte no prompt de comando:
    regasm /tlb ClassLibrary1.dll
    Verifique se o arquivo ClassLibrary1.dll está no diretório de compilação para o projeto ClassLibrary1. O ClassLibrary1.dll gera o ClassLibrary1.tlb e também registra a biblioteca de classes.
  13. Copiar o arquivo ClassLibrary1.tlb e o ComComponent.tlb arquivo para o diretório de projeto para o aplicativo ComClient.
  14. No menu Build , clique em Build Solution .
  15. Copie o arquivo ClassLibrary1.dll e o arquivo Interop.comclientLib.dll do diretório de compilação do ClassLibrary1 projeto para o diretório de compilação para o aplicativo de console ComClient.
  16. No Solution Explorer , clique com o botão direito do mouse ComClient e clique em Set as StartUp Project .
  17. No menu Debug , clique em Iniciar .
Back to the top

Referências

Para obter informações adicionais sobre interoperabilidade, consulte o livro pelo ADAM Natham:

.NET e COM: O guia de interoperabilidade completa (SAMS publicação)

Para obter informações adicionais sobre empacotamento personalizado, visite o site Microsoft Developers Network:

Custom Marshaling (http://msdn.microsoft.com/en-us/library/aa719869.aspx)

Back to the top

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbprogramming kbmarshal kbinterop kbhowto KB307713 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 307713  (http://support.microsoft.com/kb/307713/en-us/ )