Interop type cannot be embedded
I am creating a web application on the .NET 4.0 framework (beta2) in C#.
When I try to use a assembly called "ActiveHomeScriptLib", I get the following error:
Interop type 'ActiveHomeScriptLib.ActiveHomeClass' cannot be embedded. Use the applicable interface instead.
When I change the framework to version 3.5, I don't have any errors.
What is an Interop Type and why does this only occur when I use the 4.0 framework?
Solution 1:
.NET 4.0 allows primary interop assemblies (or rather, the bits of it that you need) to be embedded into your assembly so that you don't need to deploy them alongside your application.
For whatever reason, this assembly can't be embedded - but it sounds like that's not a problem for you. Just open the Properties tab for the assembly in Visual Studio 2010 and set "Embed Interop Types" to "False".
EDIT: See also Michael Gustus's answer, removing the Class
suffix from the types you're using.
Solution 2:
In most cases, this error is the result of code which tries to instantiate a COM object. For example, here is a piece of code starting up Excel:
Excel.ApplicationClass xlapp = new Excel.ApplicationClass();
Typically, in .NET 4 you just need to remove the 'Class' suffix and compile the code:
Excel.Application xlapp = new Excel.Application();
An MSDN explanation is here.
Solution 3:
Like Jan It took me a while to get it .. =S So for anyone else who's blinded with frustration.
- Right click the offending assembly that you added in the solution explorer under your project References. (In my case WIA)
- Click properties.
- And there should be the option there for Embed Interop Assembly.
- Set it to False
Solution 4:
Here's where to set the Embed Interop in Visual Studio 2012
Solution 5:
Expanding on Jon's correct answer.
The problem here is that your are combining the new "Embed Interop Types" (or NoPIA) feature with use of a class type. The "Embed Interop Types" feature works by essentially statically linking in all of the types from a PIA (Primary Interop Assembly) into the referencing assembly removing the overhead of deploying it.
This feature works great for most types in a PIA but it does have restrictions. One of them is that you cannot embed classes (it's a servicing issue). Misha has a detailed blog article on why this is not allowed
- http://blogs.msdn.com/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be-embedded-use-the-applicable-interface-instead.aspx