2011-07-06 1 views
1

J'ai un assembly COM (appelons-le com1.dll) que je référence dans un code C#. Lorsque j'ajoute une référence, je vois un Interop.com1.dll dans le nœud Références. Si j'exécute l'application à partir de Visual Studio, le code suivant fonctionnera correctement.Exception COM: "SerializationException: le flux d'entrée n'est pas un format binaire valide ..."

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

je lance alors mon script de compilation, l'exécution de la NANT suivante:

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

et

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

Lorsque j'exécute l'ensemble généré à partir du script de compilation, il sera erreur sur le var customer = new com1.Customer(); ligne de code avec la trace de pile suivante:

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

Ma question est: est-ce que quelqu'un sait pourquoi?

Répondre

2

Je l'ai compris. Incite à l'application a un fichier <project>\Properties\Licenses.licx. Lors de la construction de l'application à partir de NAnt, nous avons inclus ce fichier dans le bloc <csc><resources/></csc>. Pour une raison quelconque, cela a fonctionné jusqu'à ce que j'ajoute les références d'interopérabilité.

Ce que je devais faire était de créer un fichier de licence à partir du licx en utilisant la tâche NAnt <license/>. La sortie de cette tâche a remplacé le fichier <project>\Properties\LIcenses.licx dans la partie <csc><resources/></csc> du script de génération. Et avec cela, Bob était vraiment mon oncle.

+0

+1 pour le style. N'hésitez pas à accepter votre propre réponse (si vous avez assez de rep pour le faire?) – sehe

Questions connexes