【发布时间】:2017-03-10 10:03:36
【问题描述】:
我已获得 2 个预编译的 dll:
Common.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f3b12eb6de839f43, processorArchitecture=MSIL
Common.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f3b12eb6de839f43, processorArchitecture=MSIL
API 差异示例:
我正在尝试将两者都加载到一个项目中以执行以下操作:
extern alias v10;
extern alias v20;
private static void UpgradeUser()
{
// Load old user
var userOld = new v10::Common.Data.UserData();
userOld.loadData("user.dat");
// Create new user
var userNew = new v20::Common.Data.UserData();
// Copy properties
userNew.FirstName = userOld._firstName;
userNew.LastName = userOld._lastName;
userNew.Age = userOld._age;
// Invoke method from v10 and v20 API
userOld.version();
userNew.DisplayVersion();
if (userNew.GetUserInfo() != userOld.getInfo())
{
throw new Exception("Discrepencies in upgrade ");
}
Console.WriteLine("Upgrade done!");
}
我已将我的项目引用和app.config 设置为以下内容。我还手动将 dll 复制到我的输出文件夹中,匹配 appconfig hrefs
<!-- [Edited: see history for previous version] -->
<Reference Include="Common.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f3b12eb6de839f43, processorArchitecture=MSIL">
<HintPath>libs\Common.Data.1_0_0_0.dll</HintPath>
<Aliases>v10</Aliases>
</Reference>
<Reference Include="Common.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f3b12eb6de839f43, processorArchitecture=MSIL">
<HintPath>libs\Common.Data.2_0_0_0.dll</HintPath>
<Aliases>v20</Aliases>
</Reference>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Common.Data" publicKeyToken="f3b12eb6de839f43" culture="neutral" />
<codeBase version="1.0.0.0" href="libs\Common.Data.1_0_0_0.dll" />
<codeBase version="2.0.0.0" href="libs\Common.Data.2_0_0_0.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
我已经成功构建。
但是当我尝试运行它时,我得到一个 MissingMethodException 代表 UserData.loadData。
我浏览过多个 stackoverflow 帖子、msdn 和 codeproject 文章,但似乎无法让它发挥作用。
Link 1, Link 2, Link 3, Link 4
认为我错过了一个重要的步骤,但不知道是什么,真的需要一些帮助。
[编辑1]
我尝试过单独使用这些 dll,它们可以正常工作。 (消除了混乱。请参阅版本历史以获取屏幕截图)
[编辑2]
我尝试了 Mukesh Kumar 的提议,并将我的 app.config 更改为:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Common.Data"
publicKeyToken="f3b12eb6de839f43"
culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0"
newVersion="2.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
但它仍然不起作用。我现在收到FileNotFoundException。
[编辑3]
好的,我几乎可以肯定 <bindingRedirect> 不正确,应该改为 <codeBase>。
我尝试从 CLI 编译:
csc Program.cs /reference:v10=libs/Common.Data.1_0_0_0.dll /reference:v20=libs/Common.Data.2_0_0_0.dll
而且效果很好。我能够同时使用这两个 API:
但是当我尝试从 Visual Studio 构建它时,它会抱怨 /reference,即使我已经指定了引用别名:
The extern alias 'v10' was not specified in a /reference option
我尝试修改<Reference /> 以包含/排除<SpecificVersion>True</SpecificVersion>,但没有任何效果。
我找到了这个post,解决方案是删除并重新添加路径。使用该解决方案,Visual Studio 构建良好,但我又回到了System.MissingMethodException。
感觉我快要搞定了,但并不完全。如何让 Visual Studio 正确构建?
[编辑4]
我试过 miguel 的方法,但还是不行。
在这次尝试中,我将 dll 重命名为原来的名称,并将它们存储在不同的文件夹中。
然后我更新了 app.config 以执行 bindingRedirect 以及代码库。
运行它时,我得到MissingMethodException。
我不确定4- Find the and put in False 是什么意思,所以我尝试了<Private>、<SpecificVersion> 的所有组合,以及将<Reference Include> 设置为FQN,但这些组合都不起作用。
查看我的第三次编辑,当通过 CLI 完成时,我已经成功编译和运行示例(使用我重命名的 dlls + app.config 代码库 hrefs)。
我现在的问题是,我如何配置我的 csproj,所以它的构建是一样的。
【问题讨论】:
-
您能发布 StackTrace 吗?
-
您可以尝试从配置中删除
<runtime>部分(您不应该需要它)并将global别名添加到您的程序集中。不确定它是否会有所作为,但我一直这样做没有问题,而且我总是添加全局命名空间,比如"global,v10"。 -
找不到该方法的原因是它可能试图使用错误的程序集。为什么
loadData和Common.Data.UserDa..以红色突出显示?这是一个更清晰的错误,对吗?它说什么? -
@caesay,是的,这是一个更清晰的错误
Cannot resolve symbol 'loadData',尽管 VS 构建成功。 dll 已重命名,这就是我在 appconfig.xml 中添加runtime元素的原因。没有它,我会得到一个FileNotFoundException - Could not load file or assembly 'Common.Data... -
奇怪。也许您可以尝试将您从 Main 调用的 DLL 以其正常名称导入与可执行文件相同的文件夹中,或者编译您自己的一对 DLL 以检查库中是否存在问题。
标签: c# .net visual-studio-2015 versioning