2007年3月13日火曜日

在非托管的 VC++2005 中调用托管的 C# DLL 文件

sgnaw(李逍遥) 2006-12-20

此文介绍如何在非托管的 VC++2005 中调用托管的 C# DLL 文件 .

编写托管的 C# DLL 文件
1. 先要写一个 C# 程序,如下所示:

using System;

namespace HelloUtil
{
public class Echo
{
string myString;

public Echo(string aString)
{
myString
= aString;
}


public void Tell()
{
Console.WriteLine(myString);
}

}

}

2.编译成 DLL 文件
从开始菜单中找到"Visual Studio 2005 命令提示"并打开它, 在其中输入命令
csc /nologo /t:library /out:echo.dll echo.cs
即可编译出 echo.dll 文件.

在 VC++2005 中调用
1. 新建工程
在 VC++2005 中新建一个 "Win32 控制台应用程序" 的工程,在向导中把"预编译头"前面的勾去掉,即不使用预编译头, 完成向导. 在这里,我新建的工程名为 MyNet

2.让工程支持 CLR
项目 -> 属性 -> 配置属性 -> 常规 -> 公共语言运行库支持
选择"公共语言运行库支持(/clr)"

3.默认使用非托管的方式
在 stdafx.h 文件中最后一行输入
#pragma unmanaged

4. 主要源程序

/* -------------------------------------
MyNet.cpp -- Unmanaged C++ code calling Managed C# DLL File
(C) Wang Guofan 2006-12-20
-------------------------------------
*/

#include
"stdafx.h"

#include
<comdef.h>
#
using <System.dll>
using namespace System;

#
using "echo.dll"
#pragma managed
int abc()
{
System::String
^str = "Hello my 1st C# object !";

HelloUtil::Echo
^h = gcnew HelloUtil::Echo(str);
h
->Tell();
return 0;
}


#pragma unmanaged
int _tmain(int argc, _TCHAR* argv[])
{
abc();
return 0;
}

5. 编译
把编译好的 C# DLL 文件 copy 到 MyNet 工程目录中,编译,应该可以顺利通过,生成一个 MyNet.exe 文件。
注意: 由于程序中我引用 dll 是用 #using "echo.dll" , 因此要把 C# DLL 文件 copy 到 MyNet.exe 所在的目录里,这一步要看清楚,否则,会运行不了。
6. 运行
在 _tmain 里的 return 0 那儿设置一个断点,再按 F5 调试运行,将会在 Command 窗口里看到调用 C# DLL 后的结果:
Hello my 1st C# object !

1 件のコメント:

brightwoods さんのコメント...

在visual basic中关闭或重新启动
Shutdown or restart