Quais situações são apropriadas para a interoperabilidade de C # para C?

8

Dado que C # tem a unsafepalavra - chave, existem situações em que ainda seria benéfico interoperar com as bibliotecas C?

Pude ver a necessidade de operações de processamento de números, manipulação gráfica ou matriz muito rápidas, usando bibliotecas C preexistentes. Mas existe um caso de uso para escrever DLLs greenfield em, digamos, C99 e interoperar com elas em C #?

Eu imagino que possa haver casos extremos onde cair para C (no sentido de que é mais próximo do metal) seria a única maneira de obter as características de desempenho necessárias.

Robert Harvey
fonte
Como isso está relacionado ao C99? Especialmente porque se você estiver usando C #, é provável que você use o Visual Studio, que o AFAIK não suporta C99.
svick
O que é parcialmente o motivo pelo qual especifiquei C99. Os motivos precisam ser convincentes o suficiente para que eu consiga um novo compilador para fazer isso, e o VS já tem C ++ de qualquer maneira.
Robert Harvey

Respostas:

4

Existem algumas coisas que C tem sobre C #.

Pode fazer código em tempo real com C. Não que o Windows seja a melhor plataforma para ele. Mas eu fiz sistemas de controle em tempo real com ele. Seria bom fazê-lo em C #, e na maioria das vezes é previsível, mas nem sempre, e isso é fundamental para os sistemas RT.

Portabilidade do código C em várias plataformas (não apenas linux / windows, mas qualquer número de sistemas incorporados). Uso coisas como criptografia e compactação do Windows para dispositivos incorporados, em vez de ter uma versão em C e C # do código, mais fácil de ter uma biblioteca com interoperabilidade em C #.

Keith Nicholas
fonte
Ah, então basicamente você obtém controle completo sobre a alocação e o descarte de memória (ou seja, não precisa se preocupar com a coleta de lixo indeterminada). Mas existem maneiras de moderar esse problema em C #, certo?
Robert Harvey
4
Você basicamente descreveu quando você usaria C sobre C #. Mas essa não é a questão, a questão é sobre interoperabilidade, e você realmente não abordou isso, eu acho.
svick
4

Primeiro, unsafeé útil para muito mais que a interoperabilidade C. Por exemplo, a análise de imagens com dados de pixels reais pode ser terrivelmente lenta enquanto estiver no modo "seguro". Vire para o modo não seguro e, fazendo o mesmo trabalho com acesso direto ao buffer de imagem, é uma ordem de magnitude mais rápida.

Fazer desenvolvimento por atacado em C / C ++ para inclusão em um projeto .Net certamente faz sentido, mas tudo se resume ao desempenho. O conselho clássico seria escrever o aplicativo inteiro no idioma de sua escolha e depois criar um perfil. Quando você encontrar uma seção crítica de código que ocupa mais de 50% do tempo de processamento e não pode mais ser ajustada de forma realista enquanto estiver usando uma linguagem gerenciada, reimplemente essa rotina em C e integre-a.

Um exemplo da vida real: eu estava criando um algoritmo de localização de caminhos. Depois de mostrar que funcionava com C #, eu precisava torná-lo rápido o suficiente para executar várias vezes por segundo. Eu já havia construído uma interface de usuário de suporte agradável em C # que mostrava todos os fatores usados ​​para decisões de roteamento, resultados, etc. Por isso, reimplementei a parte principal do algoritmo de roteamento em C ++. Se eu tivesse iniciado em C ++, duvido que tivesse chegado tão longe.

Chris Pitman
fonte
2

Mas existe um caso de uso para escrever DLLs greenfield em, digamos, C99 e interoperar com elas em C #?

O principal caso de uso que vejo é quando você escreve uma lib especial direcionada para muitas plataformas em que C ou C99 está disponível, mas o C # não é ou apenas para algumas delas ("C #" pode não estar disponível para organizações). razões, não apenas técnicas).

Outro caso de uso é quando você tem um especialista em algum campo (por exemplo, um especialista sobre um hardware específico), e ele tem a tarefa de codificar parte de seu conhecimento especializado em uma biblioteca, mas esse especialista tem 30 anos de experiência em C mas nenhum em c #.

Uma coisa a considerar: "100% greenfield" é uma situação muito rara atualmente. Para a maioria dos problemas, existem pelo menos soluções parciais ou soluções semelhantes que podem ser reutilizadas quando modificadas. Portanto, usar C faz muito sentido quando você precisa criar algo novo em uma base de código C existente.

Doc Brown
fonte
Para mim, as DLLs greenfield seriam algo como equações ou transformações ad-hoc que podem ser conectadas a um sistema em tempo real. (que ainda são feitos em C onde trabalho).
22413 Robert Harvey
@RobertHarvey - Eu acho que você poderia substituir "consistência" em vez de "PME sabe C" na resposta do Doc e ter o mesmo significado. E, como Keith sugeriu em sua resposta, se você está escrevendo para um sistema rígido em tempo real, pode simplesmente querer as garantias que uma biblioteca C forneceria.
1

Sim, para interface com software legado. Eu tive que criar uma DLL de interoperabilidade que pudesse ser consumida pelo meu aplicativo C herdado para aproveitar a tecnologia que não estava disponível quando meu kit de ferramentas foi inventado.

Brian
fonte