La pregunta es claramente la forma de integrar su propio código C++ para su solución C#, no sólo lo atribuyen a utilizar con el fin para llamar a una función existente desde la API win32. Incluso si la respuesta ya fue aceptada, creo que está incompleta, y lo siguiente debe aplicarse.
Sí, es una práctica común en los casos en que la tarea puede ejecutarse más rápido, utilizar menos recursos y, en algunos casos, acceder a métodos que no están disponibles en .NET Framework.
Si su objetivo es ganar eficiencia que necesita para codificar un C no administrado nativo ++ biblioteca, se crea un nuevo proyecto no administrado C++ (que recoge como una biblioteca DLL) en el estudio visual y referencia de esta biblioteca de su proyecto de C# .
En su caso, parece que podría estar escribiendo una biblioteca C++ no administrada, y se aplica lo siguiente.
En cuanto a cualquier problema inmediato que haya preguntado sobre, afectaría el despliegue y la ofuscación.
Despliegue: Tenga en cuenta que los # archivos DLL C a construir se pueden ejecutar en cualquier CPU, 32 y 64 bits, pero esta nueva C nativa y no administrado ++ biblioteca forzar su programa para estar a favor 32 o 64 específico.
Esto es algo que va a configurar en el administrador de configuración de Visual Studio, y serán atendidos en tiempo de compilación tiempo, que recogerá Cualquier CPU para C# asambleas y para su nuevo C++ no administrado biblioteca, que estará en es su propio proyecto, tendrá para elegir entre win32 o x64.
por lo que ahora tiene 2 configuraciones, es las mejores prácticas recomendadas para tener configuraciones separadas, una para 32 y otra para 64. O desde 32 bits apoyo está cayendo muy rápido, podría centrarse en 64 bits solamente.
Además, su biblioteca podría terminar haciendo referencia al VC++ redistribuible proporcionado por Visual Studio, que podría tener que incluir en su implementación, aunque algunas versiones están incluidas en muchos sistemas operativos, encontré que raramente es el mismo que compilé con y es mejor implementarlo con su aplicación para estar seguro. Si falta este paquete, la máquina objetivo tendrá una excepción SideBySide en el eventviewer-> log de la aplicación.
Para capturar y manejar una excepción lanzada desde un código no administrado, el único truco que funciona es el vacío, el que no tiene una excepción en el paréntesis después del catch(). Para que pueda envolver sus llamadas al código no administrado en esto para manejar todas las excepciones no administradas lanzadas desde el interior del código no administrado, si coloca un tipo .net como catch (Exception), simplemente lo saltará. La única forma de atrapar una excepción no administrada, dentro del código administrado, es en este formato.
try
{
//call unmanaged code
}
catch
{
//handle unmanaged exception
}
- ofuscación: Cualquier llamada de método realizadas desde C# que ahora califican código no administrado ahora serán excluidos de cambio de nombre automáticamente. Y por el otro lado, si su no administrado biblioteca de C++ necesita para llamar a métodos de sus ensamblados administrados, los tendrá que ser excluidos de cambio de nombre, de forma manual, con el fin de ser visible para la biblioteca C++ llamar ellos.
Si lo que necesita es sólo para llamar a C bibliotecas bien conocidos ++ como los de Windows, no será necesario crear un nuevo proyecto no administrado C++, sólo utilizan la [DllImport()] atributo sugirió en una respuesta anterior. Y en este caso se podría echar un vistazo a esta referencia http://www.pinvoke.net/
¿Es eso publicidad para .NET? ¿Qué pasa con la compatibilidad multiplataforma, problemas de conexión, curva de aprendizaje, etc.? –
Curva de aprendizaje? Supongo que conoces los conceptos básicos de C++ y C# cuando intentas combinar idiomas. ¿Plataforma cruzada? Es obvio que escribir código multiplataforma en C++ es mucho más difícil, pero posible. Parece incluso un poco más fácil cuando se combina con C#: un código de nivel superior puede decidir qué partes de C/C++ se cargarán y usarán en una plataforma específica. – Harry
@Harry: Aceptaré tu respuesta cuando me muestres (por ejemplo) C# trabajando en un PIC ;-) –