>>头痛的C++托管扩展……

最近需要用到一些CLR内部的东西,例如StrongName等等,于是需要用C++来写。但是全部用C++来写感觉太累人了,所以我决定用C++扩展的方式写一个Wrapper,然后其他东西在C#里面写。可是C++扩展的文档实在是太累人了——资料残缺不全不说,有些东西还是英文的……

比如说怎么从Managed字符串转换成Unmanaged的字符串,反过来应该怎么样做,找这些资料简直就是累死人了。后来发现这个还是比较好找的:

#using
using namespace System;

void ShowU()
{
  String *Filename;
  TCHAR __pin * pinnedFilename;

  TCHAR *somethingElse;
  String ManagedSomethingElse;

  Filename = new String(“File“);
  pinnedFilename = PtrToStringChars(Filename);

  somethingElse = “Something else“;
  MangedSomethingElse = new String(somethingElse);
}

还有,怎么才能够把一个参数写成C#里面的ref byte类型,也费了不少周折。资料里面是这么说的:

C# 函数:
public void SomeFunc(ref int x) { x = 2; }
MC++ 等效函数:
public: void SomeFunc(Int32* x) { *x = 2; }
它要求在调用 SomeFunc 前对参数进行明确赋值。
此外,使用 C++ 引用表述它没有任何问题。在元数据中,除 modopt 外,C++ 引用与 C++ 指针是相同的:
[Microsoft.VisualC]Microsoft.VisualC.IsCXXReferenceModifier.

可是我花了好长时间才搞明白最后那句话的意思。原来每一个托管数据类型都会对应一个非托管的数据类型,如果用的是值,那么是可以完全当作同一个类型,但是如果用的是指针,那就有很大差别了。比如说System::Boolean和bool,如果:

bool a;
System::Boolean b;
a = b;

这是成立的,但是:

bool *a;
System::Boolean *b;
a = b;

却是不成立的。解决的办法是:

bool __pin *a;
System::Boolean *b;
a = b;

但是对于参数来说,又有一些其它的问题了:

void Any(bool &a, bool __gc &b, System::Boolean *d)
{
}

这里面的a、b、c的il表达是不一样的:

.method public static void  GetKeyFly(
bool* modopt([Microsoft.VisualC]Microsoft.VisualC.IsCXXReferenceModifier) a,
bool& modopt([Microsoft.VisualC]Microsoft.VisualC.IsCXXReferenceModifier) b,
bool& c)

我想,资料里面最后的那句话说的应该是b和c之间的区别吧,我一开始还以为是a和b的区别呢!真是搞死人了!a在C#里面绝对不是ref bool类型的,千万别搞错了。

用了几天C++托管扩展,感觉确实是一个托管和非托管之间的桥梁,工作的非常好,但是同时也是我觉得VC++是前所未有的混乱,__pin/__gc/__nogc/__box/__unbox/__try/__trycast,还有托管和非托管类型的对应关系……

现在我还有一个疑问:怎么将非托管的东西变成private的?现在全部是public的,弄了好多乱七八糟的东西出来,比如

.class private explicit ansi sealed $ArrayType$0xea34fe7f
       extends [mscorlib]System.ValueType

弄出来没有关系,别弄成public就行了,不然到了C#下面智能提示乱七八糟、乌烟瘴气的!谁知道怎么做?可以告诉我吗?

430.aspx
文章来源: http://dotnet.blogger.cn/sumtec/archive/2004/03/18/430.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值