COM异常:“SerializationException:输入流不是有效的二进制格式。起始内容......”

时间:2011-07-06 20:24:41

标签: c# com tlbimp

我有一个COM程序集(让我们称之为com1.dll),我在一些C#代码中引用它。当我添加引用时,我在References节点下看到一个Interop.com1.dll。如果我从Visual Studio执行应用程序,以下代码将运行良好。

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

然后我运行我的构建脚本,执行以下nAnt:

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

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

当我执行从构建脚本生成的程序集时,它会在var customer = new com1.Customer();代码行上出错,并带有以下堆栈跟踪:

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()

我的问题是有人知道为什么吗?

1 个答案:

答案 0 :(得分:2)

我想出来了。原来应用程序有一个<project>\Properties\Licenses.licx文件。从NAnt构建应用程序时,我们将该文件包含在<csc><resources/></csc>块中。出于某种原因,这一直有效,直到我添加了互操作引用。

我需要做的是使用NAnt <license/>任务从licx创建许可文件。该任务的输出替换了构建脚本的<project>\Properties\LIcenses.licx部分中的<csc><resources/></csc>文件。

有了这个,鲍勃真的是我的叔叔。