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);

还有很多方式,在网上查找一下便可,不过似乎很多方式可能不能实现。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值