c 语言怎么编译 .dll,将你的 C 语言代码编译成 .NET

介绍

通常情况下,对于那些使用C语言编程并开始用C#/ VB或一些其他的用于.NET的编译语言编程,那么他们希望或者甚至是需要调用我们用C语言编写的函数代码。

每当我在互联网上钻研,或说要在编译器中使用Visual C ++与/clr ,或使用pInvoke来调用C语言函数,都有这样的心情。

所以我在和我的朋友,OrangeC / C ++编译器的创造者,David交流的时候,我给他出了个主意,那就是为你的编译器创建一个新的后端来生成CLR代码,这样一来,就没有生成CLR代码的C语言开源编译器了。

在分离生成x86代码的编译器后端后,新的后端的开发在一些修复和实现之后开始了,我们已经成功取得编译器SQLite3并使用DLL与C#代码一起编译。

C / C ++编译器和到MSIL后端的链接

你可以遵循OrangeC / C ++编译器的开发,或致力于以下链接的项目贡献:

构建Orangec编译器和用于MSIL的Orangec

要构建MSIL的Orange C编译器,你需要下载OrangeC编译器的完整代码,你可以在这里得到源代码:

或者

在你下载源代码后,在C:\orangec解压所有zip文件,在解压所有文件后,你需要下载MSIL后端

解压所有文件到文件夹C:\orangec\src\occ,当出现替代选项的时候,接受替代文件。

要构建和生成源代码,必须具备下面其中一个编译器:MinGW

Borland C / C ++ 5.5(我用这个编译器来构建编译程序)

CLang

Visual C / C ++ 10

OrangeC 编译器

在下载和解压所有文件后,打开CMD导航到文件夹C:\orangec\src,type,config.bat,在执行config.bat,type后:omake fullbuild

这将建立所有的orangec编译器。

构建后,也许你会看到一个关于创建zip文件的错误,但是不要担心。

好了,现在你已经编译好了所有的OrangeC / C ++工具链,为了构建后端到MSIL,你需要去到文件夹C:\orangec\src\occ\netil,在这个文件夹里面,type(在系统路径中具备ILASM 和CSC (C#编译器)编译器时必须的):omake netlib.lib

omake

在执行这一命令后,你就有了occil.exe

使用OrangeC编译器来生成MSIL代码

要使用编译器,你只需下载这篇文章中提供的链接,创建文件夹C:\orangec,解压该文件夹中的所有zip内容,打开CMD,然后导航到C:\orangec文件夹,在orangec 文件夹中,type,config.bat后,当运行 config.bat文件时,一个新的环境变量将在CMD背景下创建,因此编译器可以定位include文件夹。

*重点* ——在你的路径中具备ILASM.EXE很有必要,为了做到这一点,你有两个办法把 ILASM放到你的路径中:运行VSVARS32.BAT

在你的CMD中执行以下命令:PATH =C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

在构建生成的IL代码到EXE / DLL时,在路径中具备ilasm是有必要,然而我们正在OrangeC中实施oilasm。

创建一个小例子

创建一个名为“float_to_ieee754.c”的C文件,并把代码放到C文件:#include #include #include char *strrev_t(char *str){    char *p1, *p2;    if (!str || !*str)        return str;    for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)

{

*p1 ^= *p2;

*p2 ^= *p1;

*p1 ^= *p2;

}    return str;

}void floatToBinary(float f, char *str, int numeroDeBits){    int i = 0;    int strIndex = 0;    union

{        float f;        unsigned int i;

}u;

u.f = f;    memset(str, '0', numeroDeBits);    for (i = 0; i 

{

str[strIndex++] = (u.i & (1 <

u.i >>= 1;

}

str[strIndex] = '\0';

str = strrev_t(str);

}int main(){    float input = 0.0;    const int numeroDeBits = 32;    char *str = (char*)malloc(sizeof(char) * numeroDeBits);    printf("Type a float number to convert to binary: ");    scanf("%f", &input);

floatToBinary(input, str, numeroDeBits);    printf("%s\n", str);    if(str != NULL)    free(str);

return 0;

}

现在,为了构建代码,你需要在CMD中键入:occil /NProgram.FloatToBinary /9 float_to_ieee754.c

每个参数的说明:/N.

/9: C99 mode

在执行此命令后,编译器将生成指向你的代码的IL代码和occil调用ilasm来生成来自于IL代码的EXE / DLL。如果你想看到生成的IL代码,只要看看你的C代码所在的文件夹,打开“float_to_ieee754.il”。

生成IL代码://File float_to_ieee754.il//Compiler version MSIL Compiler.corflags 3 // 32-bit.assembly float_to_ieee754 { }

.assembly extern mscorlib { }

.assembly extern lsmsilcrtl { }

.namespace 'Program' {

.class public explicit ansi sealed 'FloatToBinary' {

.field public static valuetype 'Program.FloatToBinaryøint8[]' 'L_3' at $L_3

.data $L_3 = bytearray (25 73 a 0)

.field public static valuetype 'Program.FloatToBinaryøint8[]' 'L_2' at $L_2

.data $L_2 = bytearray (25 66 0)

.field public static valuetype 'Program.FloatToBinaryøint8[]' 'L_1' at $L_1

.data $L_1 = bytearray (54 79 70 65 20 61 20 66

6c 6f 61 74 20 6e 75 6d    62 65 72 20 74 6f 20 63

6f 6e 76 65 72 74 20 74

6f 20 62 69 6e 61 72 79

3a 20 0)

.method public hidebysig static int32 'main'(int32 'argc', void * 'argv')  cil managed

{// Line 43:    int main()

.maxstack    3

.locals(

[0]        float32 'input/0',

[1]        void* 'str/1'

)

L_4:// Line 45:        float input = 0.0;

ldloca    'input/0'

ldc.r4    0.0

stind.r4// Line 46:        const int numeroDeBits = 32;

ldloca    'str/1'

ldc.i4    32

conv.u4

call  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值