Frage

Dieser Code erzeugt eine FileNotFoundException, aber letztlich läuft ohne Probleme:

void ReadXml()
{
    XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
    //...
}

Hier ist die Ausnahme:


Eine erste Chance Ausnahme des Typs 'System.IO.FileNotFoundException' ist in mscorlib.dll aufgetreten

Weitere Informationen: Die Datei oder Assembly 'MyAssembly.XmlSerializers, Version = 1.4.3190.15950, Culture = neutral, PublicKeyToken = null' oder eine ihrer Abhängigkeiten laden. Das System kann die Datei nicht finden angegeben.


Es scheint, dass der Rahmen automatisch die Serialisierungsassembly erzeugt, wenn es nicht gefunden wird. I kann manuell erzeugen sgen.exe verwenden, die die Ausnahme mildert.

Wie kann ich Visual Studio, um die XML-Serialisierung Baugruppe automatisch zu generieren?


Update: Die Serialisierung Assembly generieren: Auf Einstellung erscheint nicht, etwas zu tun,

.
War es hilfreich?

Lösung

Dies ist, wie ich es durch Modifizieren der MSBUILD Skript in meinem CSPROJ zu tun, Datei verwaltet:

Öffnen Sie zunächst Ihre CSPROJ Datei als Datei und nicht als ein Projekt. Scrollen Sie bis zum Ende der Datei, bis Sie diese auf Kommentar Code, kurz vor dem Ende des Projekts Tag:

<!-- To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->

Jetzt haben wir nur unser eigenes Afterbuild Ziel einfügen alle vorhandenen XmlSerializer und SGen unsere eigenen zu löschen, etwa so:

<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)">
   <!-- Delete the file because I can't figure out how to force the SGen task. -->
   <Delete
     Files="$(TargetDir)$(TargetName).XmlSerializers.dll"
     ContinueOnError="true" />
   <SGen
     BuildAssemblyName="$(TargetFileName)"
     BuildAssemblyPath="$(OutputPath)"
     References="@(ReferencePath)"
     ShouldGenerateSerializer="true"
     UseProxyTypes="false"
     KeyContainer="$(KeyContainerName)"
     KeyFile="$(KeyOriginatorFile)"
     DelaySign="$(DelaySign)"
     ToolPath="$(TargetFrameworkSDKToolsDirectory)"
     Platform="$(Platform)">
      <Output
       TaskParameter="SerializationAssembly"
       ItemName="SerializationAssembly" />
   </SGen>
</Target>

Das ist für mich funktioniert.

Andere Tipps

Wie Martin in seine Antwort , Einschalten Erzeugung des Serialisierungsassembly durch die Projekteigenschaften ist nicht genug, denn die SGen Aufgabe der sgen.exe Befehlszeile des /proxytypes Schalter hinzugefügt wird.

Microsoft hat eine MSBuild Eigenschaft dokumentiert, die Sie die deaktivieren können /proxytypes Schalter und bewirkt, dass die SGen Aufgabe, die Serialisierungsassemblys selbst zu erzeugen, wenn es kein Proxy-Typ in der Montage ist.

  

SGenUseProxyTypes

     

Ein boolescher Wert, ob Proxy-Typ angibt,   sollte durch Sgen.exe erzeugt werden. Das SGen Ziel verwendet diese Eigenschaft zu   gesetzt den UseProxyTypes Flagge. Diese Eigenschaft standardmäßig true, und   ist keine Benutzeroberfläche, dies zu ändern. Zur Erzeugung des für Serialisierungsassembly   Nicht-Webservice-Typen, fügen Sie diese Eigenschaft auf die Projektdatei und legen Sie es   false bevor die Microsoft.Common.targets einzuführen oder   C # / VB.targets

Wie die Dokumentation schlägt vor, Sie Ihre Projektdatei von Hand ändern müssen, aber Sie können die SGenUseProxyTypes Eigenschaft Ihrer Konfiguration hinzufügen Generation zu ermöglichen. Ihre Projektdateien Konfiguration würde am Ende etwas wie folgt aussehen:

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    <!-- Snip... -->
    <GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
    <SGenUseProxyTypes>false</SGenUseProxyTypes>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <!-- Snip... -->
    <GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
    <SGenUseProxyTypes>false</SGenUseProxyTypes>
  </PropertyGroup>

Die anderen Antworten auf diese Frage hat bereits das Projekt Eigenschaften-> Bau erwähnt -> generiert Serialisierungsassemblys Einstellung aber durch diese standardmäßig nur die Baugruppe erzeugen, wenn es „ XML-Webdienst Proxy-Typ “im Projekt.

Der beste Weg, das genaue Verhalten von Visual Studio zu verstehen ist, um das GenerateSerializationAssemblies Ziel innerhalb der C zu untersuchen: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 ** Microsoft.Common. Ziele ** Datei.

Sie können prüfen, das Ergebnis dieser Build-Task aus dem Visual Studio Output und wählen Sie Erstellen die Option anzeigen Ausgabe von : Dropdown Box. Sie sollten etwas entlang der Linien von

siehe

C: \ Programme \ Microsoft Visual Studio 8 \ SDK \ v2.0 \ bin \ sgen.exe /assembly:D:\Temp\LibraryA\obj\Debug\LibraryA.dll / proxytypes / Referenz: .. / Compiler: / delaysign- LibraryA -> D: \ Temp \ LibraryA \ bin \ Debug \ LibraryA.dll

Der entscheidende Punkt ist hier der / proxytypes Schalter. Sie können für die XML Serializer Generator Tool über die verschiedenen Schalter lesen ( Sgen.exe)

Wenn Sie mit MSBuild vertraut sind, könnten Sie das GenerateSerializationAssemblies Ziel so anpassen, dass SGen Aufgabe ein Attribut UseProxyTypes hat = „false“ statt wahr, aber dann müssen Sie an Bord alle zugehörigen Verantwortung der Anpassung des Visual Studio / MSBuild-System zu übernehmen. Alternativ können Sie einfach Ihren Build-Prozess erweitern SGen anrufen manuell ohne die / proxytypes wechseln.

Wenn Sie lesen Sie die Dokumentation für SGen sie ziemlich klar, dass Microsoft die von dieser Möglichkeit Gebrauch begrenzen wollte. In Anbetracht der Menge an Lärm zu diesem Thema ist es ziemlich klar, dass Microsoft mit Dokumentation der Visual Studio Erfahrung nicht machen einen großartigen Job. Es gibt sogar eine für dieses Problem Feedback zur Artikel Schließen Sie und die Antwort ist nicht groß.

eine neue sgen Aufgabendefinition zu schaffen bricht eine Fliege auf dem Rad. setzt nur die benötigten Variablen, um die Aufgabe der Arbeit zu machen, wie beabsichtigt. Wie auch immer die Microsoft-Dokumentation fehlen einige wichtige Informationen.

Schritte vorzunehmen erzeugen Serialisierungsassemblys

(mit Teilen von http://msdn.microsoft.com/en-us/library/ff798449 aspx )

  1. Sie in Visual Studio 2010 im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, für das Serialisierungsassemblys generieren möchten, und dann Unload auf Projekt.
  2. im Projektmappen Explorer mit der rechten Maustaste auf das Projekt, für das Serialisierungsassemblys generieren möchten, und dann auf Bearbeiten CSPROJ klicken.
  3. In der CSPROJ Datei unmittelbar nach dem <TargetFrameworkVersion>v?.?</TargetFrameworkVersion> Elemente, fügen Sie die folgenden Elemente:

      

    <SGenUseProxyTypes>false</SGenUseProxyTypes>   <SGenPlatformTarget>$(Platform)</SGenPlatformTarget>

  4. In der CSPROJ Datei, in jeder Plattformkonfiguration

    z. <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">

    fügen Sie die folgende Zeile:

    <GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>

  5. Speichern und die CSPROJ Datei schließen.

  6. im Projektmappen Explorer mit der rechten Maustaste auf das Projekt, das Sie gerade bearbeitet und dann neu laden auf Projekt.

Dieses Verfahren erzeugt eine zusätzliche Montage .xmlSerializers.dll in Ihrem Ausgabeordner benannt. Sie müssen diese Baugruppe mit Ihrer Lösung implementieren.


Erklärung

SGEN standardmäßig nur für Proxy-Typen erzeugt für „Any CPU“. Dies geschieht, wenn Sie nicht über die entsprechenden Variablen in der Projektdatei festgelegt.

SGenPlatformTarget benötigt, um Ihre PlatformTarget anzupassen. Ich neige dazu, zu denken, dies ein Fehler in der Projektvorlage ist. Warum sollte die sgen Zielplattform von Ihrem Projekt unterscheiden? Ist dies der Fall werden Sie eine Laufzeitausnahme erhalten

  

0x80131040: Die manifest Definition befindet Assembly nicht die Montagereferenz überein

Sie können die msbuild Aufgabendefinition finden, indem Sie Ihre Projektdatei zu analysieren:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Dabei gilt MSBuildToolsPath hängt von Ihrem <TargetFrameworkVersion> http://msdn.microsoft.com/en-us/library /bb397428.aspx

Ansehen der SGen Aufgabendefinition für TargetFrameworkVersion 4.0 von

  

Windows-Installationspfad \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.CSharp.targets

die undokumentierte Variablen wie $ (SGenPlatformTarget) zu sehen, Sie sind frei in Ihrer Projektdatei setzen

<Target
    Name="GenerateSerializationAssemblies"
    Condition="'$(_SGenGenerateSerializationAssembliesConfig)' == 'On' or ('@(WebReferenceUrl)'!='' and '$(_SGenGenerateSerializationAssembliesConfig)' == 'Auto')"
    DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource"
    Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)"
    Outputs="$(IntermediateOutputPath)$(_SGenDllName)">

    <SGen
        BuildAssemblyName="$(TargetFileName)"
        BuildAssemblyPath="$(IntermediateOutputPath)"
        References="@(ReferencePath)"
        ShouldGenerateSerializer="$(SGenShouldGenerateSerializer)"
        UseProxyTypes="$(SGenUseProxyTypes)"
        KeyContainer="$(KeyContainerName)"
        KeyFile="$(KeyOriginatorFile)"
        DelaySign="$(DelaySign)"
        ToolPath="$(SGenToolPath)"
        SdkToolsPath="$(TargetFrameworkSDKToolsDirectory)"
        EnvironmentVariables="$(SGenEnvironment)"
        SerializationAssembly="$(IntermediateOutputPath)$(_SGenDllName)"
        Platform="$(SGenPlatformTarget)"
        Types="$(SGenSerializationTypes)">
            <Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly"/>
    </SGen>
</Target>

Falls jemand anderes in dieses Problem läuft plötzlich nach allem funktioniert gut vor: Für mich ist es mit dem „Enable Just My-Code (Managed Only)“ Kontrollkästchen ist nicht markiert im Optionsmenü (Optionen -> Debugging) zu tun hatte (das wurde automatisch ausgeschaltet, nachdem .NET Reflector Installation).

EDIT: Was natürlich zu sagen ist, dass diese Ausnahme vor sich ging, aber als „enable nur meinen Code“ ist aus, die Debug-Assistent (sofern aktiviert), an dieser Stelle stoppen, wenn geworfen.

Ich bin ein wenig an die Partei spät, aber ich fand die vorherige Antwort schwer zu verarbeiten. Insbesondere Visual Studio abstürzen würde, wenn ich die Eigenschaften meines Projektes zu sehen versucht. Ich meine, dies auf die Tatsache zurückzuführen ist, dass es nicht mehr verstanden, wie die csproj Datei zu lesen. Das sagte ...

Fügen Sie folgendes zu Ihrem Postbuildereignis Befehlszeile:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\sgen.exe" "$(TargetPath)" /force

Dies wird nutzen sgen.exe direkt die XML-Serialisierung Montage jedes Mal neu zu erstellen Sie Ihr Projekt für Debug oder Release-Build.

Schauen Sie in den Eigenschaften auf die Lösung. Auf der Build-Register am unteren Rand befindet sich eine Drop-Down „Gene Serialisierungsassembly“ genannt

Eine etwas andere Lösung als die von Gehirn Backup zur Verfügung gestellt direkt sein könnte, um die Zielplattform direkt angeben, wo Sie verwenden müssen es etwa so:

<!-- Check the platform target value and if present use that for a correct *.XmlSerializer.dll platform setup (default is MSIL)-->
<PropertyGroup Condition=" '$(PlatformTarget)'=='' ">
  <SGenPlatform>$(Platform)</SGenPlatform>
</PropertyGroup>
<PropertyGroup Condition=" '$(PlatformTarget)'!='' ">
  <SGenPlatform>$(PlatformTarget)</SGenPlatform>
</PropertyGroup>

<!-- Delete the file because I can't figure out how to force the SGen task. -->
<Delete Files="$(TargetDir)$(TargetName).XmlSerializers.dll" ContinueOnError="true" />
<SGen
  BuildAssemblyName="$(TargetFileName)"
  BuildAssemblyPath="$(OutputPath)"
  References="@(ReferencePath)"
  ShouldGenerateSerializer="true"
  UseProxyTypes="false"
  KeyContainer="$(KeyContainerName)"
  KeyFile="$(KeyOriginatorFile)"
  DelaySign="$(DelaySign)"
  ToolPath="$(SGenToolPath)"
  SdkToolsPath="$(TargetFrameworkSDKToolsDirectory)"
  EnvironmentVariables="$(SGenEnvironment)"
  Platform="$(SGenPlatform)">
  <Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" />
</SGen>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top