Pergunta

Muitas vezes eu preciso incluir pequenos pedaços de código nativo em meu c aplicativos #, que eu tendem a fazer via C ++ / CLI. Normalmente eu só precisa usar uma biblioteca C ++ para o qual não existe nenhuma boa alternativa para .NET; mas às vezes o desempenho é um fator também.

Isso é problemático; isso significa adicionar uma referência a um x86 específica ou biblioteca x64. A maioria das bibliotecas apoiar tanto compilação de 64 bits e de 32 bits, ou exigir apenas pequenas modificações para trabalhar sob 64-bit. No entanto, só posso referência um das versões de um alvo em particular C # compilação de projeto. Isso significa que eu preciso adicionar vários alvos construir à mão para cada projeto na solução.

VS.NET é extremamente inúteis neste caso: Se você adicionar uma biblioteca C ++ e C biblioteca # para a mesma solução, e o C # e bibliotecas C ++ tem ambas as metas 32 e 64 bits, sua solução irá conter um "Qualquer CPU" alvo, a "plataformas mistas" target, um alvo x64, um alvo x86 (que é o C # chama 32-bit), um alvo win32 (que é o C ++ chama 32-bit), e talvez mais; tudo em pelo menos duas versões (sendo lançamento e de depuração, a menos que você adicionou mais).

rápido confuso deste get, e sem uma boa razão. O comportamento óbvio não deve ser tão complicado: se eu tenho um projeto C # referência a um projeto C ++, então ele deve ser um pouco óbvio que a versão de 64 bits deve fazer referência a versão de 64-bit, e similarmente para 32-bits

A pior parte de tudo isso é que tudo isso resulta em dois executáveis ??separados, mas idênticos: a Qualquer CPU .NET projeto pode funcionar sem modificações em ambos os modos de 32 e 64 bits, mas eu não encontrei uma maneira de carregar o apropriado específico da plataforma de suporte bibliotecas dependendo do modo do aplicativo foi iniciado em.

Para resumir esta longa caminhada:

  • É possível tornar o trabalho com VS em aplicativos multi-plataformas menos de uma dor - para obtê-lo para adicionar as referências adequadas para as metas de construção adequadas, sem mãos dadas?
  • Existe uma maneira simples de fazer um .NET executável com referências específicas da plataforma que podem ser executados tanto no modo de 32-bit e 64-bit, carregando o montagens apropriadas conforme necessário?
Foi útil?

Solução

A principal pergunta que você deve se perguntar é, você precisa de uma versão de 64-bit. Para mais detalhes ver blogs mensagens de Scott Hanselman e mim .

Se você realmente precisa de ambas as versões, você pode também carregar tanto o de 32 bits e de 64 bits biblioteca no GAC, de modo que o tempo de execução pode escolher o correto automaticamente.

Se você não quer GAC suas bibliotecas, você também pode dar uma olhada em este post StackOverflow, onde uma maneira de carregar a correta montagem é descrito. Eu realmente não gosto dessa solução, porém, porque ele realmente exige um modelo de plug-in

Outras dicas

A minha resposta é SIM. Uma abordagem possível é a utilização de arquitetura addin para que ele funciona como este,

  1. Quando seu c # aplicativo é executado em x86, ele carrega a versão x86 do suplemento.
  2. Quando ele é executado em x64, ele carrega a versão x64.

Então você preparar dois projectos para as versões de suplemento. Um deles é configurado para compilar para 86, enquanto a outra para x64. Por sua vez, o x86 suplemento wraps sobre x86 construção da biblioteca C ++, eo x64 sobre construção x64 da biblioteca C ++.

Este é um pouco complicado porque você tem que manter dois arquivos de projeto suplemento, enquanto os arquivos de origem pode ser compartilhado.

Usando addin arquitetura, as bibliotecas de suplemento são carregadas em tempo de execução, então você tem tempo de sobra para detectar se agora em x86 ou x64, e então decidir qual suplemento de carga.

Espero que isso ajuda.

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