2010-05-31 47 views
9

我正在尝试调用C#中用C++/CLI编写的方法。 C++/CLI代码用于更新Oracle数据库中的TIMESTAMP列,给定记录ID和System::DateTime对象,该对象是Oracle的TIMESTAMP类型的.NET兼容数据类型。使用System :: DateTime参数调用C++/CLI方法需要'ValueType'作为参数?

我打电话的方法具有以下原型:

bool ChangeJobUpdateDate (int jobIdIn, System::DateTime^ updateDateIn) 

我已经加入到一个测试项目,我做了这个DLL项目的引用;我正在用C#编写测试。然而,当我尝试调用从C#单元测试项目这种方法,功能似乎有以下方法声明(通过智能感知):

bool ChangeJobUpdateDate (int jobIdIn, ValueType updateDateIn) 

我固然不是熟悉C++/CLI,所以有什么我失踪?

回答

11

我怀疑这是因为您使用DateTime^而不是DateTime。这是一个值类型,那么你为什么要使用引用?

C#没有表示与值类型相关的装箱引用类型的任何方式,所以它可以做的最好的是ValueType - 我嫌疑这是发生了什么,虽然我不能肯定地说,由于我缺乏C++经验。尝试只是DateTime,看看看起来如何...

+1

就是这样!看起来我需要花更多时间阅读这些^%&*符号的含义。谢谢! :) – 2010-05-31 17:58:47

+3

这就是它。 C++/CLI实际上会将值的实际类型编码到签名中 - 在这种情况下,在IL中,完整类型将是:class [mscorlib] System.ValueType modopt([mscorlib] System.DateTime)modopt([mscorlib ] System.Runtime.CompilerServices.IsBoxed) - 这是C++/CLI编译器后来如何知道正确类型并进行适当的类型检查 - 但C#只是忽略了所有的'modopt',并将其视为普通的'ValueType'。 – 2010-05-31 18:35:22

+0

@Pavel:谢谢你的细节。我真的只是在做一个有根据的猜测。随意编辑所有这些善良到我的答案 - 或添加自己的:) – 2010-05-31 19:00:23