Исключение COM: «SerializationException: входной поток не является допустимым двоичным форматом. Начальное содержимое ...» - PullRequest
1 голос
/ 07 июля 2011

У меня есть COM-сборка (назовем это com1.dll), на которую я ссылаюсь в некотором коде C #. Когда я добавляю ссылку, я вижу 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 Ответ

2 голосов
/ 07 июля 2011

Я понял это. Оказывается, приложение имеет файл <project>\Properties\Licenses.licx. При создании приложения из NAnt мы включали этот файл в блок <csc><resources/></csc>. По какой-то причине это работало, пока я не добавил ссылки на взаимодействие.

Мне нужно было создать файл лицензии из licx с помощью задачи NAnt <license/>. Вывод этой задачи заменил файл <project>\Properties\LIcenses.licx в части <csc><resources/></csc> сценария сборки.

И с этим Боб действительно был моим дядей.

...