vc托管调用c#dll

众所周知,c#编译器编译代码为托管代码,可以使用vs自带的返编译工具查看代码结构,而vc不但能够编译非托管代码,使得不能被反编译,它又能编译托管代码,不过新建工程的时候默认的是非托管代码。这样一来在vc中调用c#编译出来的dll文件就会产生一些问题:

fatal error C1190: 托管目标代码需要“/clr”选项

可以更改环境配置进行解决:属性->配置属性->常规->公共语言运行时支持,改为:公共语言运行时支持(/clr),这样编译器就会产生托管代码,因为产生的最终文件不是二进制文件,所以生成的exe文件要比非托管的大很多。

vs2010添加dll文件也很方便,与c#环境的类似,只不过vs2010的添加要在属性->框架和引用->添加新引用。还有要注意的地方是.h文件不能定义为托管,因此在.h文件内部定于诸如PTZControl::PTZControl^ pcontrol;的变量会出现错误:

error C3265: 无法声明托管“pcontrol”(在非托管“CmyFfplayDlg”中)
1>          不能声明全局或静态变量,也不能声明引用 gc 堆中对象的本机类型成员

查了很多资料,终于有了解决办法:将上述变量定义为:gcroot<PTZControl::PTZControl^> pcontrol;解决了托管代码不能定义全局变量以及静态变量问题。

实例化C#的类不要使用c++中的方式,使用“^”号代替间接寻址指针操作符“*”。而用gcnew代替new。

开发期间如果用到字符串传递参数,比如vc的CString 向C#的string传递,直接传递是不能传递成功的,需要进行转换,我使用这样的:

System::String^ m_SerIp = gcnew System::String(m_ServerIp);//m_Server 为CString类型
System::String^ m_CliIp = gcnew System::String(m_ClientIp);

还有很多方式,在网上查找一下便可,不过似乎很多方式可能不能实现。

你可能感兴趣的:(C#,dll,VC,托管代码)