4

我有一个场景,我需要存储在应用程序私有文件夹中的同一程序集的多个版本,结构如下:

.\My.dll          // latest version, say 1.1.3.0
.\v1.1.1\My.dll   // version 1.1.1.0
.\v1.1.2\My.dll   // version 1.1.2.0

我的问题是 .Net 运行时,当被要求提供旧版本之一时,总是找到最新版本,然后由于内部版本号不匹配而失败,然后再尝试探测更好的匹配。

程序集是强命名的,我在 app.config 中使用此配置:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="My" 
                publicKeyToken="xxxxxxxx" culture="netural" />

                <bindingRedirect oldVersion="1.0.0.0-1.1.1.0" 
                    newVersion="1.1.1.0" />
                <bindingRedirect oldVersion="1.1.3.0-1.1.65535.65535" 
                    newVersion="1.1.3.0" />

                <codeBase version="1.1.1.0" href="v1.1.1\My.dll" />
                <codeBase version="1.1.2.0" href="v1.1.2\My.dll" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

希望我在这里错过了一些东西。我知道这可以通过监听AppDomain.AssemblyResolve事件在代码中解决,但我希望看到一个纯粹的配置解决方案。

更新:所以我发现了这个错误,正如 Kent 假设的那样,是一个错字。culture="netural"应该是culture="neutral"。也就是说,如果没有错字,当使用codeBase指向每个版本的元素时,解析效果很好。在这种情况下,探测元素似乎不起作用。

4

2 回答 2

1

在没有看到整个解决方案的情况下,我只能假设您在某处有错字。我只是为自己尝试了这个 - 在fuslogvw的帮助下,我能够让它工作。

我有三个版本的程序集,使用应用程序引用的版本比其输出目录中的版本旧。CLR 找到重定向和 codeBase 条目并加载正确的(旧)版本。

如果您提供电子邮件地址,我可以通过电子邮件向您发送我的解决方案。

肯特

于 2009-03-19T09:49:45.740 回答
0

你可以使用探测路径吗?我们使用它来强制不受控制(例如第三方解析器 - 例如 MSTest)在我们需要它们的地方寻找程序集。

<?xml version ="1.0"?>
<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <probing privatePath="v1.1.1;v1.1.2;"/>
        </assemblyBinding>
    </runtime>
</configuration>

请参阅此处了解更多信息

于 2009-03-18T20:25:18.043 回答