130
votes

In Visual Studio, when adding one reference to the project, the properties window has an option Embed Inteop Types, should we set it to True or False? What's the difference?

Since we have a lot of projects, among some of them, reference was set to False, others were set to True, it is totally mess up. And the bulid server also have the same warnings:

What does “reference was created to embedded interop assembly” mean?

So we plan to change all the Embed Inteop Types to False, what risk would we get?

2
Never do this, it is a very awesome feature that solves irksome deployment details. You have to understand COM to truly grok what this is all about.Hans Passant
@HansPassant, are you saying never set them false or never change them (e.g. if they default to false already)?noelicus
He plans to set it to False. Never do this.Hans Passant
@HansPassant how comes you use irksome and grok. it's very brittish :DMafii
@Mafii I thought grok was from Stranger in a Strange Land (which is American). Doesn't mean the British might not use it more, of course!StayOnTarget

2 Answers

83
votes

This option was introduced in order to remove the need to deploy very large PIAs (Primary Interop Assemblies) for interop.

It simply embeds the managed bridging code used that allows you to talk to unmanaged assemblies, but instead of embedding it all it only creates the stuff you actually use in code.

Read more in Scott Hanselman's blog post about it and other VS improvements here.

As for whether it is advised or not, I'm not sure as I don't need to use this feature. A quick web search yields a few leads:

The only risk of turning them all to false is more deployment concerns with PIA files and a larger deployment if some of those files are large.

8
votes

I noticed that when it's set to false, I'm able to see the value of an item using the debugger. When it was set to true, I was getting an error - item.FullName.GetValue The embedded interop type 'FullName' does not contain a definition for 'QBFC11Lib.IItemInventoryRet' since it was not used in the compiled assembly. Consider casting to object or changing the 'Embed Interop Types' property to true.