código de chamada C ++ de um aplicativo C # ou porta-lo?
Pergunta
Eu recentemente sido lutando com um algoritmo que foi mal implementada (ie o desenvolvedor foi retirado em outro projeto e não conseguiu documentar adequadamente o que tinha feito) em C #.
Eu encontrei uma alternativa (a partir de receitas numéricas), que funciona, mas é escrito em C ++. Então, eu estou pensando provavelmente a maneira mais segura de obter algo de trabalho seria para embrulhar o C ++ em uma DLL.
Tendo em conta que eu ainda sou um pouco verde quando se trata de C # e nunca tentou fazer uma DLL a partir do zero, isso soa como uma abordagem razoável (e em caso afirmativo, se alguém tentou isto / tem algum conselho) ? Ou devo ir o porco inteiro e tentar porta do C ++ rotina em C #?
Editar - Não estou procurando ninguém para tomar a decisão para mim, mas se alguém tem alguma exprience de qualquer rota que eu estaria interessado em ouvir as suas opiniões e as armadilhas desagradáveis ??que deveria ser evitado. Por exemplo, como desagradável está passando em listas de dados de C # para a C ++ vector STL?
Solução
Eu tentei ligar para C-dll do c # código com resultados muito bons, embora eu tive alguns problemas para enviar dados entre os ambientes. Caso contrário, o procedimento é bastante simples. Quanto mais dados você envia e para trás (ambos quantidade e freqüência) o mais lento o seu programa será executado, mas você provavelmente já descobriram isso em seu próprio país.
A principal desvantagem foi a manutenção do c # -c código de cola (código de interface) cada vez que algo mudou ou alguém encontrou um bug.
Aqui está um pouco de código para você começar:
using System.Runtime.InteropServices;
class myDllCaller {
//call to function in the dll returning an int
[DllImport("MyFavorite.dll")]
private static extern int dllFunction(//list of parameters to function);
public static void Main() {
int rerult = dllFunction();
}
}
Outras dicas
Se as referências C # versão Mitch não é de uma licença adequada para seus propósitos, você poderia usar um wrapper gerenciado C ++, que poderiam reutilizar, e envolva o código C que você tem, mas continua a ser visível para seus aplicativos gerenciados como um NET nativo montagem. Eu usei essa abordagem no passado para usar a API C de uma biblioteca que não tem a sua própria API Net nativa, e achei dados de triagem relativamente indolor entre os dois.
... Ou você pode baixar o código já implementado em C # a partir aqui .
Depende quais são seus objetivos.
Se é para ter um aplicativo de trabalho que eu pesar-se os custos e benefícios de ambas as abordagens e ir com o mais rentável.
Se é para melhorar o seu C #, em seguida, por todos os meios reescrever a C.