Como acessar a interface CORBA sem IDL ou métodos de comunicação remota com ligação tardia

Estamos usando um "COM License Bridge" da SAP para acessar o servidor de licenças e consultar a chave de hardware de um sistema programaticamente (para reutilizar sem o próprio licenciamento). Isso funcionou bem nas versões SAP Business one 2007A, 2007B e 8.8, mas na 8.81 elas parecem ter atualizado sua interface CORBA sem atualizar o wrapper COM, porque agora obtemos exceções de memória ao tentar chamar a função GetHardwareKey.

ntão baixei o IIOP.NET e comecei a tentar escrever minha própria interface. Eu nunca gostei desse invólucro COM de qualquer maneira. Mas encontrei meu antigo inimigo do .NET remoting - a incapacidade de chamar um método remoto sem ter uma interface comum definida no servidor e no cliente. Tentei usar o compilador IDL para CLS incluído no IIOP.NET, mas continuo recebendo erros sobre a interface ser incompatível (a SAP não forneceu um arquivo IDL). Não sei como o IIOP e o CORBA determinam se uma interface é compatível. Mas até tentei depurar o código IIOP.NET e forçá-lo a executar o método, apesar da incompatibilidade, mas recebi uma string vazia de volta em vez da chave de hardware que eu queri

Meu próximo passo é tentar implementar um servidor de licença falso e examinar as solicitações vindas do cliente de produção, na esperança de identificar o que elesdevemo parece, mas não estou contando com muito sucesso, considerando a dificuldade que tive em examinar as entranhas do .NET remotin

Meu problema real é como obter ou gerar a chave de hardware do SAP Business One, mas as questões decorrentes inclue

Como reflito ou consulte informações sobre uma interface CORBA? Posso usar o método list da classe NamingContext para recuperar uma lista de objetos disponíveis, mas não vejo se há uma maneira de consultar métodos disponíveis em um objet Posso invocar dinamicamente métodos de comunicação remota .NET sem ter uma interface? Vejo que existe algo chamado DII para chamar dinamicamente o CORBA, mas não vejo como usá-lo no IIOP.NEPosso invocar métodos de comunicação remota do .NET com apenas uma interface delegada ou incompleta? Tentei usar a palavra-chave dinâmica, mas não foi possível invocar um método no meu objeto remoto MarshalByRef ... Acho que disse que o método não existia na minha instância MarshalByRef ou algo assim. Porém, só tentei isso através do IIOP.NET (eu me pergunto se ele funciona para comunicação remota normal do .NETComo criar ou inspecionar instâncias de mensagem na estrutura de comunicação remota do .NEPosso enviar ou recuperar mensagens remotas diretamente, ignorando os proxies subjacente

Editar Consegui fazer o IIOP.NET / CORBA acreditar que tinha uma interface compatível aplicando o atributo RepositoryID:

[Ch.Elca.Iiop.Idl.InterfaceType(Ch.Elca.Iiop.Idl.IdlTypeInterface.ConcreteInterface)]
[Ch.Elca.Iiop.Idl.RepositoryID("IDL:LicenseInfo:1.0")]
public interface ILicenseInfo : Ch.Elca.Iiop.Idl.IIdlEntity
{
    void GetHardwareKey(out string hwKey);
}

Mas ainda estou obtendo um resultado de string vazio.

Edit 2: Depois de mais experimentação e depuração, descobri que as mensagens de resposta contêm os dados que estou procurando, mas não estão sendo analisados corretamente nos valores do cliente, provavelmente por causa de minha definição incorreta da interface. Esperar que a depuração no processamento de resposta me ajude a descobrir como corrigir minha interface. Estranhamente, a primeira coisa que está analisando a partir da resposta é um valor nulo em caixa, que não parece adequado para um parâmetro "out string"

Edit 3: Descobri que preciso aplicar atributos de string a parâmetros como este para impedir que sejam tratados como valores em caixa:

void GetHardwareKey([StringValue(), WideChar(true)] out string hwKey);

Mas apesar do atributo WideChar, estou recebendo um erro sobre o CodeSet não suportar WChar ou algo assim. Estou entendendorealment perto de descobrir isso.

Edit 4: Estou perplexo em como definir o conjunto de códigos para o WChar. Se não o definir, recebo um erro: "Conjunto de códigos WChar não especificado ou não é suportado". porque o servidor retornou uma cadeia unicode sem substituir o conjunto de caracteres padrão. Não consigo encontrar nenhuma maneira de substituir isso do cliente. Tentei ligar para:

omg.org.CORBA.OrbServices.GetSingleton().OverrideDefaultCharSets(
    CharSet.UTF8, WCharSet.UTF16);

Mas isso não parece ter nenhum efeito no final do cliente. O código de exemplo mostra a chamada no final do servidor. Mas eu não escrevi o servidor, então não posso controlar isso. Minha única opção de reescrever o código IIOP.NET para meus próprios fins está forçando um WChar CodeSet padrão a entrar em vigor?

questionAnswers(2)

yourAnswerToTheQuestion