2010-07-13 21 views
5

Podemos recopilar biblioteca de C como .Net DLL (que contiene la apertura y el acceso a todas las funciones libs C) con sólo la compilación de proyectos de CPP que contiene un código comoUna forma de compilar la biblioteca C en .Net dll?

extern "C" { 
#include <library.h> 
} 

con /clr:pure discusión con VS? (VS10)

O deberíamos hacer algo más trickey?

Respuesta

3

Encontré que es el mejor para usar el viejo estilo de C++ administrado para esto.

CLR:PURE simplemente no lo cortaré.

Ejemplo:

extern "C" int _foo(int bar) 
{ 
    return bar; 
} 

namespace Bar 
{ 
    public __gc class Foo 
    { 
    public: 
    Foo() {} 

    static int foo(int bar) 
    { 
     return _foo(bar); 
    } 
    }; 
}; 

compilar con: /clr:oldSyntax

ya se puede hacer referencia a la assebmly, y llamar a Bar.Foo.foo() de .NET.

+0

¿Qué quieres decir con eso? Por favor, proporciona simple samle? – Rella

+0

@Ole Jak: Ejemplo agregado. – leppie

+0

podría explicar qué es '__gc', cómo se compilará este código en .net dll (quiero decir, ¿qué vamos a tener en él y cómo?) – Rella

3

Realmente depende de su código C.

P/Invoke es a menudo la más fácil de empezar, y la IMO es bastante viable para un puñado de funciones. El rendimiento no es necesariamente bueno, y no construiría un programa completo a partir de él, pero para reutilizar algunas funciones, vale la pena.

ir de C a/CLR: pura requiere que usted:

  1. Convert your C code to C++
  2. Convert your C++ code to Visual C++
  3. Compile with /clr option
  4. Compile with /clr:pure

El estado actual de su código (y es bibliotecas) dictará qué tan doloroso es ese proceso.

+0

"thay" dice que no necesita P/Invoke para usar .Net dll. "thay" dice que puedes compilar el código C++ (archivos CPP) en .Net dll usando el argumento 'clr: pure' con VS. – Rella

+0

@Ole - "Ellos" son correctos. Está llegando a ese punto de C, que es probable que te dé ataques. –

+0

En sus otras (he perdido conteo, tal vez cinco) preguntas acerca de esto, Ole estableció el requisito de que todo compilara en un solo archivo. 'DllImport' no te llevará allí. –

1

Generalmente no se puede dar por hecho que se pueda compilar código C como C++ sin realizar algunos cambios. Si puede obtener su código C para compilar como C++, entonces puede intentar compilarlo como C++/CLI (eso es lo que hace la opción clr: pure).

En ese momento, puede crear algún tipo de clase que exponga todas sus funciones exportadas como métodos estáticos de una clase pública (administrada).

Algunos sabores de este tipo de cosas se pueden hacer con trucos de preprocesador de C++ (macros, etc.), a veces terminas escribiendo envoltorios manualmente.

Así que la información básica que puede compilar C++ en ensamblados .NET utilizando las opciones/clr: xxx es verdadera, pero eso no significa que sea lo único que necesita hacer para obtener un ensamblado .NET útil.

+0

están por ahí tutos paso a paso o historias de éxito en artículos de blog o algo así? – Rella

4

Esto puede ser de interés para usted: Compiling your C code to .NET

Crear un compilador C occil.exe

Para crear un archivo DLL .NET desde un código c por ejemplo stack.c

Paso 1: construir pila.c al código IL

occil /ostackdll.il /c /Wd /9 /NStackLib.Stack stack.c 

Paso 2: construir al código generado para IL .NET DLL

ilasm /DLL stackdll.il 

A continuación, puede referencia al stack.dll en el programa de C# y llamar a la función C en la pila .c

Cuestiones relacionadas