Pergunta

Alguém aí já usou o GOLE biblioteca com C#?Se sim, quais armadilhas você encontrou e qual a melhor forma de usar a biblioteca?Estou pensando em usá-lo como um wrapper para um programa que foi escrito em C e quero agrupar os arquivos de cabeçalho onde possa usá-los em meu aplicativo .NET.

Editar:Alguns esclarecimentos sobre os sistemas operacionais de destino.

Pretendo executar o aplicativo no Linux e no Windows, por isso estou pesquisando o SWIG.P/Invoke não é uma opção.

Foi útil?

Solução

Acho que o erro que os postadores anteriores cometeram foi ler os documentos e não olhar os exemplos.

Algumas horas atrás eu precisei fazer a interface de algumas classes C++ com C#.Procurei no meu diretório Swig (já o tinha para outros trabalhos), encontrei o diretório Examples/csharp/class, naveguei no código, carreguei a solução, groquei, copiei, coloquei meu código, funcionou, meu trabalho estava feito.

Dito isso, o código P/Invoke gerado não é uma solução para todas as necessidades.Dependendo do seu projeto, pode ser igualmente simples escrever você mesmo alguns wrappers de API simples ou escrever C++ gerenciado (procure SlimDX para obter um excelente exemplo disso).

Para as minhas necessidades, foi simples e fácil - eu tinha mystuff.dll, e agora além disso posso enviar mystuffnet.dll.Concordo que é difícil entrar no documento.

Editar:Notei que o OP mencionou apenas C.Para isso, você realmente não precisa do Swig, basta usar o sintaxe de interoperabilidade C#/C DLLImport usual.Swig se torna útil quando você quer deixar Aulas C++ ser invocado a partir de C#.

Outras dicas

Para meu último projeto, aqui está todo o arquivo de configuração do C# SWIG:

%module mdProject

%{
#include "mdProject.h"
%}

Eu compilei no SWIG com:

swig -csharp -c++ -I../../Include mdProject.i

Isso gerou um Project.cxx que compilei e vinculei diretamente na DLL 'principal', então não precisei de uma segunda DLL 'auxiliar' do C++.O SWIG também gerou vários arquivos C# que compilei em uma DLL .NET.Meus outros wrappers (Java, PHP, etc) usam uma DLL auxiliar.

Como @patrick mencionou, SWIG usa P/Invoke, então se você tiver algum problema com isso, precisará encontrar outra solução.

Se você usar tipos que fogem do comum (vazios, estruturas, etc), você terá que fazer algum trabalho extra para acertar, mas para a API média usando int's, char*'s etc, tudo bem.

Tentei usar o SWIG para agrupar um projeto C++ para uso no .NET há alguns anos.

Não fui muito longe, pois foi uma grande dor de cabeça produzir a configuração que o SWIG exigia.Na época eu só queria uma solução, não aprender outra linguagem/api/etc.SWIG pode ser mais fácil de usar hoje em dia, eu não saberia dizer.

Acabamos usando Managed C++ para encerrar o projeto C++.Funcionou muito bem.

Se você está apenas invocando funções diretamente de uma dll, sugiro que não se preocupe com nenhuma das opções acima e apenas use P/Invocar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top