Dado que C # tem a unsafe
palavra - 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.
Respostas:
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 #.
fonte
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.
fonte
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.
fonte
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.
fonte