2017-01-18 14 views
1

У меня есть два разных файла xsd, связанных с двумя разными проектами VS2010.Использование xsd.exe для генерации классов C# с помощью SchemaImporterExtension. Без изменения machine.config

Первый, названный BasicTypes.xsd «сначала построен», используя xsd.exe, и сгенерированные классы встроены в мою сборку NetToolbox.dll.

При создании второй (с именем Entity.xsd), мне нужно повторно использовать уже сгенерированный класс (Доступно в NetToolbox.dll), потому что типы в Entity.xsd определены в BasicTypes.xsd. Это находится в сборке EntityProvider.dll.

Кроме того, во время выполнения я должен передать эти объекты от EntityProvider.dll до NetToolbox.dll, поэтому определение того же класса является обязательным (я думаю, может быть, я ошибаюсь здесь).

Этот вопрос очень похож на следующую ссылку, но предложенный ответ не представляется возможным для меня (Изменяя machine.config): Using xsd.exe to generate C# classes, how to specify an existing type?

Я попробовал предложенное решение (Изменяя machine.config) без успеха у меня действительно было трудное время правильно указывая сборку в файле machine.config и xsd.exe parameter.xml.

<system.xml.serialization> 
    <schemaImporterExtensions> 
     <add type="SchemaImport.ADODBSchemaImporterExtension, SchemaImport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cd583032ee337c41" /> 
    </schemaImporterExtensions> 
</system.xml.serialization> 

Например, вот два XSD. BasicTypes.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://www.tempuri.com/BasicTypes" 
      xmlns="http://www.tempuri.com/BasicTypes" 
      elementFormDefault="qualified"> 

    <xs:complexType name="PositionType"> 
     <xs:sequence> 
      <xs:element name="latitude" type="xs:double" /> 
      <xs:element name="longitude" type="xs:double" /> 
      <xs:element name="altitude" type="xs:double" minOccurs="0" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

и Entity.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://www.tempuri.com/Entity" 
      xmlns="http://www.tempuri.com/Entity" 
      elementFormDefault="qualified" 
      xmlns:bt="http://www.tempuri.com/BasicTypes"> 

    <xs:import namespace="http://www.tempuri.com/BasicTypes" schemaLocation="directory\BasicTypes.xsd" /> 

    <xs:element name="entity" type="EntityType" /> 

    <xs:complexType name="EntityType"> 
     <xs:complexContent> 
      <xs:extension base="bt:PositionType"> 
       <xs:attribute name="id" type="xs:string" /> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

Использование любого другого инструмента третьей стороной, чем выданные рамками .NET (я в 4.0) или VS2010 не вариант (ограничения безопасности)

Спасибо

ответ

0

Вы можете зарегистрировать расширение схемы импортера в файле конфигурации для утилиты xsd.exe я а не в файле machine.config.

Для этого сделайте копию приложения xsd.exe где-нибудь в структуре вашего проекта и создайте файл с именем xsd.exe.Config в том же каталоге. Добавьте строки для регистрации расширения импортера схемы внутри корневого элемента configuration.

Для вашего примера файл xsd.exe.Config будет выглядеть следующим образом. Обратите внимание, что в элементе add требуется атрибут name, я использовал имя класса расширения.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.xml.serialization> 
     <schemaImporterExtensions> 
      <add name="ADODBSchemaImporterExtension" type="SchemaImport.ADODBSchemaImporterExtension, SchemaImport, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cd583032ee337c41" /> 
     </schemaImporterExtensions> 
    </system.xml.serialization> 
</configuration> 
+0

Это, вероятно, означает, что я должен зарегистрировать свою сгенерированную сборку в GAC? (Базовый XSD является частью пользовательской сборки .NET). Или есть способ принудительного конструирования? –