Re: Right way of passing unmanaged structures between managed and native code?

Tech-Archive recommends: Fix windows errors by optimizing your registry

From: Ronald Laeremans [MSFT] (ronaldl_at_online.microsoft.com)
Date: 03/31/04


Date: Wed, 31 Mar 2004 15:19:43 -0800

This article is talking about taking (in C++.Net version 7.x terms about the
layout between:

__gc struct Foo
{
  SomeType SomeMember;
  ...
};

or

__value struct Foo
{
  SomeType SomeMember;
};

And

struct Foo
{
  SomeType SomeMember;
}

And NOT about the latter definition compiled either with or without the
/CLR switch.

If you use ildasm on the latter type you will see that it is eximitted in a
CLR sense as an opqaue (i.e. empty type) with explicit layout and explicit
size with the compiler generated code directly managing the layout. Which is
indeed guaranteed to be the same in either case.

Ronald

"Vladimir Kouznetsov" <vladimir.kouznetsov@ngrain.com> wrote in message
news:OhyZgA2FEHA.3640@tk2msftngp13.phx.gbl...
> Thank you Ronald,
>
> I found the following phrase
>
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstecha
> rt/html/vbtchtroubleshootingnetinteroperability.asp "Troubleshooting .NET
> Interoperability"): "Because Visual Studio .NET optimizes the way data is
> stored, the unmanaged representation of the structure does not always
match
> the managed representation". From that I concluded that either alignment
or
> order of members or both can be different for managed and unmanaged code.
If
> I'm misinterpreting that, that probably should be clarified. Otherwise if
> that is incorrect I'm happy to know that.
>
> thanks,
> v
>
> "Ronald Laeremans [MSFT]" <ronaldl@online.microsoft.com> wrote in message
> news:eFothx1FEHA.3064@tk2msftngp13.phx.gbl...
> > Hi Vladimir,
> >
> > Unmanaged types are guaranteed to have the same representation
regardless
> of
> > whether they are compiled with or without the /clr switch. What
> > documentation or experiment makes you believe otherwise?
> >
> > Ronald Laeremans
> > Visual C++ team
> >
> > "Vladimir Kouznetsov" <vladimir.kouznetsov@ngrain.com> wrote in message
> > news:%23hbHnueFEHA.3032@TK2MSFTNGP09.phx.gbl...
> > > Hi group,
> > >
> > > It seems there are no guarantees that the same unmanaged structures
have
> > the
> > > same binary representation for managed and native code. How do I use
> them
> > in
> > > mixed-code assemblies? Is there just some compiler magic behind
curtains
> > > (IJW, some implicit marshalling, which can lead to a performance
> > > degradation) or the data are binary compatible in these scenarios or I
> > > perhaps should use attributes to explicitly specify the layout (which
> BTW
> > > may depend on compiler switches increasing complexity of maintenance)?
> > >
> > > thanks,
> > > v
> > >
> > >
> >
> >
>
>