我已经得到了两个预编译的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>
我已经成功构建了这个程序。
但是当我尝试运行它时,UserData.loadData
出现了一个 MissingMethodException
错误。
我已经查看了多个stackoverflow帖子、msdn和codeproject文章,但似乎无法使其正常工作。
我认为我可能错过了一些重要的步骤,但却找不出来,真的需要一些帮助。
[编辑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]
好的,我几乎可以确定不正确,应该改为。
我尝试从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,进行绑定重定向以及 codebase。
运行时出现 "MissingMethodException" 错误。
我不确定 "4- Find the and put in False" 是什么意思,所以我尝试所有 "", "" 的组合,以及将 "" 设置为 FQNs,但是这些组合都没有起作用。
通过查看我的第三个编辑,当通过 CLI 完成时,我已经成功编译和运行了示例(同时通过修改的 dlls + app.config 的 codebase 链接)。现在我的问题是,如何配置我的 csproj,使其能够构建相同的东西。
loadData
和Common.Data.UserDa..
会被标记成红色?这是Resharper的错误吗?它说了什么? - caesayruntime
元素的原因。如果没有它,我会得到一个FileNotFoundException - Could not load file or assembly 'Common.Data...
。 - jayars