使用xsd.exe使用SchemaImporterExtension生成C#类。无需修改machine.config

时间:2017-01-18 22:50:25

标签: c# .net xml xsd

我有两个不同的xsd文件与两个不同的VS2010项目相关联。

第一个名为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提供的任何其他第三方工具不是一个选项(安全限制)

谢谢

1 个答案:

答案 0 :(得分:0)

您可以在xsd.exe实用程序本身的配置文件中注册架构导入程序扩展,而不是在machine.config文件中。

要执行此操作,请在项目的目录结构中的某处创建xsd.exe应用程序的副本,并在同一目录中创建名为xsd.exe.Config的文件。添加行以在configuration根元素内注册模式导入器扩展。

对于您的示例,xsd.exe.Config文件如下所示。请注意,name元素中需要add属性,我使用了扩展类的名称。

<?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>