On 25 Jul 2013, at 18:40, Aaron Oneal <[email protected]> wrote:

> Can you share a code snippet? Are you using mono_object_to_string to retrieve 
> the string value for display?
> 
Perhaps the code below will help illustrate the point.

In C the tick count looks okay by my reckoning but the string representation is 
bad:

Obj-C:
// NSLog(@"NSDate date = %@ Mono DateTime = %@ ticks = %lld", dateNow, 
dateString, ticks); says
NSDate date = 2013-07-26 09:19:30 +0000 Mono DateTime = 01/01/0001 00:00:01 
ticks = 635104271706805504

When I send the Mono DateTime to a C# property incoming argument gets logged as:
C#:
DateMethod arguments : 01/01/0001 00:00:01 ticks = 12436392

This is on Mono 3.0.10. I will check out 3.2.0

Obj-C:
- (void)testDateRepresentation
{
    NSDate *dateNow = [NSDate date];
    MonoObject *monoDateTime = [dateNow monoDateTime];
    NSDate *dateFromMonoObject = [[NSDate alloc} 
initWithMonoDateTime:monoDateTime];
    
    // validate the NSDate representation
    NSAssert(fabs([dateFromMonoObject timeIntervalSinceDate:dateNow]) < 0.1, 
@"bad date");  // sanity check
    
    // validate the Mono representatiom
    int64_t ticks = DB_UNBOX_INT64(DBMonoObjectGetProperty(monoDateTime, 
"Ticks"));
    MonoString *monoString = mono_object_to_string(monoDateTime, NULL);
    NSString *dateString = [NSString stringWithMonoString:monoString];
    NSLog(@"NSDate date = %@ Mono DateTime = %@ ticks = %lld", dateNow, 
dateString, ticks);     // see output above ^
}

// NSDate 

- (id)initWithMonoDateTime:(MonoObject *)monoDateTime {
        MonoObject *boxedTicks = DBMonoObjectGetProperty(monoDateTime, 
"Ticks");        
        int64_t ticks = DB_UNBOX_INT64(boxedTicks);
        NSTimeInterval interval = (NSTimeInterval)(ticks - 
EPOCH_START_DIFFERENCE) / NET_TICKS_PER_SECOND;
        self = [self initWithTimeIntervalSinceReferenceDate:interval];

        return(self);
}

// Mono property

MonoObject *DBMonoObjectGetProperty(MonoObject *monoObject, const char 
*propertyName) {
        MonoObject *monoException = NULL;
        MonoClass *klass = mono_object_get_class(monoObject);
        MonoMethod *monoMethod = GetPropertyGetMethod(klass, propertyName);
        
        MonoObject *retval = NULL;
        if(monoMethod != NULL) {
                void *invokeObj = mono_class_is_valuetype(klass) ? 
mono_object_unbox(monoObject) : monoObject;
                retval = mono_runtime_invoke(monoMethod, invokeObj, NULL, 
&monoException);
        }
        
        if(monoException != NULL) 
@throw(NSExceptionFromMonoException(monoException));
        
        return(retval);
}

C#
        // date methods
        public DateTime DateMethod(DateTime d1)
        {
            DateTime now = DateTime.UtcNow;

            Console.WriteLine ("DateMethod arguments : {0} ticks = {1}", d1, 
d1.Ticks);
            Console.WriteLine ("DateTime Now : {0} ticks = {1}", now, 
now.Ticks);
            return d1;
        }

Jonathan
_______________________________________________
Mono-list maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to