PC Review


Reply
Thread Tools Rate Thread

binary compatibility support for .NET assembly

 
 
someone
Guest
Posts: n/a
 
      27th Jul 2004
Suppose that I have a class in an assembly that is delivered to the user,
what can I do to change the class so that it doesn't break the
binary compatibility? That is, user application can run with recompiling
and relinking.

I know that if I define an interface, and only expose the interface but not
the class which implments the interface, I can add a data member to the
class without breaking the binary compatibility. If the class itself,
rather than the interface is exposed to user, can I still add a data member
to the class without breaking the binary compatibility? What are other
restrictions that won't break the binary compatibility?

In pure C++, adding a data member to a class that is exposed to the user
will break compatibility.

Thanks.


 
Reply With Quote
 
 
 
 
someone
Guest
Posts: n/a
 
      27th Jul 2004

> Suppose that I have a class in an assembly that is delivered to the user,
> what can I do to change the class so that it doesn't break the
> binary compatibility? That is, user application can run with recompiling
> and relinking.


A mistake: 'with' should be 'without'.


 
Reply With Quote
 
Niki Estner
Guest
Posts: n/a
 
      28th Jul 2004
"someone" <(E-Mail Removed)> wrote in
news:%(E-Mail Removed)...
> Suppose that I have a class in an assembly that is delivered to the user,
> what can I do to change the class so that it doesn't break the
> binary compatibility? That is, user application can run with recompiling
> and relinking.


..net applications are just-in-time compiled; There is no "linker". The kind
of tasks that used to be done by the linker are done at runtime (by the JIT)
anyway.

> I know that if I define an interface, and only expose the interface but

not
> the class which implments the interface, I can add a data member to the
> class without breaking the binary compatibility. If the class itself,
> rather than the interface is exposed to user, can I still add a data

member
> to the class without breaking the binary compatibility?


Yes.

> What are other restrictions that won't break the binary compatibility?


Don't remove methods, make them private or change their signature if they
are used by the client. You'll get a "MissingMethodException" if the JIT
can't find a method that's called in your code.

> In pure C++, adding a data member to a class that is exposed to the user
> will break compatibility.


Yep. There are ways around this, but they usually require some work.
That's one of the reasons why .net was invented.

Niki


 
Reply With Quote
 
Niki Estner
Guest
Posts: n/a
 
      28th Jul 2004
"Niki Estner" <(E-Mail Removed)> wrote in
news:ez9YT%(E-Mail Removed)...
> "someone" <(E-Mail Removed)> wrote in
> news:%(E-Mail Removed)...
> > Suppose that I have a class in an assembly that is delivered to the

user,
> > what can I do to change the class so that it doesn't break the
> > binary compatibility? That is, user application can run with

recompiling
> > and relinking.

>
> .net applications are just-in-time compiled; There is no "linker". The

kind
> of tasks that used to be done by the linker are done at runtime (by the

JIT)
> anyway.


Sorry, that wasn't 100% correct: There is a linker (al.exe) that fuses
modules and resources, but it is rarely used, at least not in a usual
VS-build cycle.

Niki


 
Reply With Quote
 
someone
Guest
Posts: n/a
 
      28th Jul 2004
What about enumeration constants defined? if their value is changed, I
assume that the binary compatibility is broken. I know that this is true in
C++.

"Niki Estner" <(E-Mail Removed)> wrote in message
news:ez9YT%(E-Mail Removed)...
> "someone" <(E-Mail Removed)> wrote in
> news:%(E-Mail Removed)...
> > Suppose that I have a class in an assembly that is delivered to the

user,
> > what can I do to change the class so that it doesn't break the
> > binary compatibility? That is, user application can run with

recompiling
> > and relinking.

>
> .net applications are just-in-time compiled; There is no "linker". The

kind
> of tasks that used to be done by the linker are done at runtime (by the

JIT)
> anyway.
>
> > I know that if I define an interface, and only expose the interface but

> not
> > the class which implments the interface, I can add a data member to the
> > class without breaking the binary compatibility. If the class itself,
> > rather than the interface is exposed to user, can I still add a data

> member
> > to the class without breaking the binary compatibility?

>
> Yes.
>
> > What are other restrictions that won't break the binary compatibility?

>
> Don't remove methods, make them private or change their signature if they
> are used by the client. You'll get a "MissingMethodException" if the JIT
> can't find a method that's called in your code.
>
> > In pure C++, adding a data member to a class that is exposed to the user
> > will break compatibility.

>
> Yep. There are ways around this, but they usually require some work.
> That's one of the reasons why .net was invented.
>
> Niki
>
>



 
Reply With Quote
 
Niki Estner
Guest
Posts: n/a
 
      28th Jul 2004
I'm sorry, my first reply was definitely too short; Unfortunately I didn't
find any good article on the subject; So, here's a short list of things I
that came to my mind right now; In general
- You may safely change default values of data members
- You may safely change all private/internal fields of a class/struct
- You may usually add properties or methods to an existing class or struct
(this only hurts the client if it derives a class from that class, and
happens to add a property/method with the same signature)
- You may usually add data members and events to a class or struct, unless
you use binary serialization in your clients (the binary layout changes with
new data members)
- Removing, renaming or changing the type/signature of public/protected
properties/data members/events/methods can cause clients to crash (however
unlike C++ you'll get something like a "MethodNotFoundException", and no
memory will be overwritten) if (and only if) the client uses that member
- Removing an interface or changing the base class may hurt clients, if the
client casts to that class/interface
- Changing static constants/enums causes clients to break (didn't think of
that before your post)

Of course this list isn't complete, and there are may still be some cases
where even these rules don't work (e.g. if the client tries to invoke a
non-existing method using late-binding; If you add that method, the client
will behave differently). But I hope that this at least gives you a rough
sketch of what is done at compile-time, and what is done at run-time.

In general, if you expect an assembly to change often, using interfaces for
communication is not a bad idea.

Niki

"someone" <(E-Mail Removed)> wrote in
news:(E-Mail Removed)...
> What about enumeration constants defined? if their value is changed, I
> assume that the binary compatibility is broken. I know that this is true

in
> C++.
>
> "Niki Estner" <(E-Mail Removed)> wrote in message
> news:ez9YT%(E-Mail Removed)...
> > "someone" <(E-Mail Removed)> wrote in
> > news:%(E-Mail Removed)...
> > > Suppose that I have a class in an assembly that is delivered to the

> user,
> > > what can I do to change the class so that it doesn't break the
> > > binary compatibility? That is, user application can run with

> recompiling
> > > and relinking.

> >
> > .net applications are just-in-time compiled; There is no "linker". The

> kind
> > of tasks that used to be done by the linker are done at runtime (by the

> JIT)
> > anyway.
> >
> > > I know that if I define an interface, and only expose the interface

but
> > not
> > > the class which implments the interface, I can add a data member to

the
> > > class without breaking the binary compatibility. If the class itself,
> > > rather than the interface is exposed to user, can I still add a data

> > member
> > > to the class without breaking the binary compatibility?

> >
> > Yes.
> >
> > > What are other restrictions that won't break the binary compatibility?

> >
> > Don't remove methods, make them private or change their signature if

they
> > are used by the client. You'll get a "MissingMethodException" if the JIT
> > can't find a method that's called in your code.
> >
> > > In pure C++, adding a data member to a class that is exposed to the

user
> > > will break compatibility.

> >
> > Yep. There are ways around this, but they usually require some work.
> > That's one of the reasons why .net was invented.
> >
> > Niki
> >
> >

>
>



 
Reply With Quote
 
 
 
Reply

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Binary Compatibility in .NET =?Utf-8?B?RGF2ZVA=?= Microsoft VB .NET 2 2nd Aug 2005 01:23 PM
Binary compatibility? Michi Henning Microsoft C# .NET 3 4th May 2005 03:22 PM
Binary Compatibility equivalent in .NET ? Jimi Microsoft Dot NET Framework 7 16th Aug 2004 06:04 PM
binary compatibility support for .NET assembly someone Microsoft Dot NET 6 28th Jul 2004 10:18 PM
binary compatibility support for .NET assembly someone Microsoft Dot NET Framework 5 28th Jul 2004 10:18 PM


Features
 

Advertising
 

Newsgroups
 


All times are GMT +1. The time now is 06:44 AM.