Search code examples
c#comtlbimp

COM exception: "SerializationException: The input stream is not a valid binary format. The starting contents..."


I have a COM assembly (let's call it com1.dll) that I'm referencing in some C# code. When I Add Reference I see an Interop.com1.dll in under the References node. If I execute the application from Visual Studio, the following code will run fine.

public void DoStuff()
{
    var customer = new com1.Customer();
    customer.DoSomething();
}

I then run my build script, executing the following nAnt:

<tlbimp output="Interop.com1.dll" typelib="com1.dll" namespace="com1"/>

and

<csc output="myapp.exe" target="winexe" debug="true">
    <sources>
        ...
    </sources>
    <references>
        <include name="Interop.com1.dll"/>
        ...
    </references>
</csc>

When I execute the assembly generated from the build script it will error on the var customer = new com1.Customer(); line of code with the following stack trace:

System.Runtime.Serialization.SerializationException: The input stream is not a valid binary format. The starting contents (in bytes) are: 44-65-76-45-78-70-72-65-73-73-2E-58-74-72-61-45-64 ...
   at System.Runtime.Serialization.Formatters.Binary.SerializationHeaderRecord.Read(__BinaryParser input)
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadSerializationHeaderRecord()
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
   at System.ComponentModel.Design.DesigntimeLicenseContextSerializer.Deserialize(Stream o, String cryptoKey, RuntimeLicenseContext context)
   at System.ComponentModel.Design.RuntimeLicenseContext.GetSavedLicenseKey(Type type, Assembly resourceAssembly)
   at System.ComponentModel.LicenseManager.LicenseInteropHelper.GetCurrentContextInfo(Int32& fDesignTime, IntPtr& bstrKey, RuntimeTypeHandle rth)
   at MyApp.MyClass.DoStuff()

My question is does anyone know why?


Solution

  • I figured this out. Turns out the application has a <project>\Properties\Licenses.licx file. When building the application from NAnt we were including that file in the <csc><resources/></csc> block. For some reason this worked until I added the interop references.

    What I needed to be doing was creating a license file from the licx using the NAnt <license/> task. The output from that task replaced the <project>\Properties\LIcenses.licx file in the <csc><resources/></csc> portion of the build script.

    And with that, Bob truly was my uncle.