Recomendação para invólucro C ++ para plataforma transversal em-processo ligações biblioteca dinâmica (isto é, um peso leve, de alto desempenho COM ou CORBA) [fechado]
-
13-09-2019 - |
Pergunta
Estamos desenvolvendo um aplicativo que terá um plug-in "arquitetura" para permitir aos consumidores do aplicativo para fornecer os seus próprios algoritmos proprietários. (Nós, basicamente, ter um conjunto de analisadores e permitir que terceiros para fornecer o seu próprio bem)
O espaço de domínio exige um desempenho muito elevado, de modo out-of-process ligações não estão indo para o trabalho e nós preferimos deixar as coisas pesadas como CORBA e COM sozinho.
Basicamente estamos procurando um simples invólucro de plataforma cruzada em torno de:
- biblioteca de carregamento de um caminho relativo
- fornecer um mapeamento da dll especial / .so para alguma configuração / name
- fazer alguma inicialização e consultar a biblioteca para garantir que ele fornece a funcionalidade necessária
Eu acho que isso é realmente apenas uma envolvendo em torno de LoadLibrary () e as chamadas de método exportados. Podemos escrever este nós mesmos, mas prefiro usar código existente como temos o suficiente no nosso prato.
Mais uma vez, o rendimento e desempenho são muito, muito importante.
perguntas similares são:
Cross-plataforma alternativa para COM - este é perto, mas nós queremos in-processo só - sem necessidade de fora do processo e as nossas necessidades são um pouco "mais leve"
.C ++ Cruz Plataforma bibliotecas dinâmicas; Linux e Windows
Isto é para não gerenciado C ++ - não podemos usar .NET
EDIT - o que encontramos
Poco funciona muito bem para as nossas necessidades. Como um bônus Esta página é um comentário muito apreciado sobre o estado de desenvolvimento C ++ e a direção idioma ...
Foi uma simples plataforma de embrulho cruz que precisávamos que Poco fornece. Realmente não há muito a ele, mas ainda poupa-nos tempo e testes. Nenhuma sobrecarga adicional durante o tempo de execução.
Solução 2
Eu acho que isso também pode funcionar: http://pocoproject.org/docs/Poco.SharedLibrary.html
Outras dicas
O ACE biblioteca contém invólucros para carregamento de biblioteca dinâmica que cruz trabalho plataforma. Se você quiser mais conforto do que LoadLibrary planície em seguida olhar para TAO A ACE ORB . Usando corba com TAO é extemamente alto desempenho e muito provavelmente supera qualquer auto trabalhada plugin de infra-estrutura, especialmente se você usar em chamadas de processo, como TAO otimiza-los.
Para usar a plataforma cruzada biblioteca dinâmica invólucro usar ACE_DLL. Ele fornece o wrapper plataforma mais básico cruz em torno de LoadLibrary () que você mencionou.
Entre usando ACE_DLL e usando TAO é o quadro de configuração de serviço da ACE que permite objetos de carga dinamicamente. Após o carregamento você pode obter um ponteiro upcast ao objeto carregado que você implementou e pode chamar qualquer método no objeto carregado.
O código para fazer isso ficaria assim:
char const * const cpc_myClass = ACE_DYNAMIC_SERVICE_DIRECTIVE(
"myclass",
"dllname",
"_make_MyClass",
""
);
result = ACE_Service_Config::process_directive(cpc_myClass);
MyClass * p_obj = ACE_Dynamic_Service<MyClass>::instance ("myclass");
p_obj->callAnyMethodYouLike();
Aqui é explicado que TAO conhece dois tipos de otimização de colocation (thru_poa e diretas):
Ao usar a estratégia direta, método invocações em objetos co-instalados tornar chamadas diretas para servo sem verificar o status do POA.
Você pode se surpreender com o quão eficaz TAO pode ser, se usado corretamente. Sugiro criar uma simples prova de conceito e fazer medidas.