我有一个应用程序,需要与两个版本的DLL工作。我想我只会编译一次该应用程序,将该exe文件复制到两个目录中,然后将这两个版本的dll复制到这些目录中的每一个。仅供参考,我没有对GAC做任何事情。但是,我得到了一个FileLoadException异常版本与它没有编译的DLL。FileLoadException与新版本的DLL
在项目中,我将“特定版本”设置为虚假的dll引用。但是,也许这是错误的设置。我如何获得这个工作与多个版本?
我有一个应用程序,需要与两个版本的DLL工作。我想我只会编译一次该应用程序,将该exe文件复制到两个目录中,然后将这两个版本的dll复制到这些目录中的每一个。仅供参考,我没有对GAC做任何事情。但是,我得到了一个FileLoadException异常版本与它没有编译的DLL。FileLoadException与新版本的DLL
在项目中,我将“特定版本”设置为虚假的dll引用。但是,也许这是错误的设置。我如何获得这个工作与多个版本?
我反对改变配置文件,只是因为这是我需要做的另一件事。关于不同版本的DLL的地址更改,我不认为我有这个问题,因为我实际上使用一个接口来调用我的方法。
为了提供更多的细节,我只需要在多个dll中创建一种类型的实例。从那里,我把它当作一个接口对象。所以,这里是我的解决方案:
Assembly asm = Assembly.LoadFrom("XXX.YYY.ZZZ.Bin.dll");
Type type = asm.GetType("MyType");
IMyType obj = Activator.CreateInstance(type) as IMyType;
这似乎工作。
如果您所引用的程序集是强签名的,则CLR将不会加载它,只要它的版本不同于它所编译的版本。你可以在这种情况下使用的配置文件来指定版本,你想用:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="YouAssemblyNameWithoutDotDll"
publicKeyToken="your-assembly-token"
culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0"
newVersion="2.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
当然这个假设集的新版本具有相同的方法签名或者你会得到一个MissingMethodException在运行时。
这是因为每次重新编译dll时,函数的地址都会改变。由于你在编译时绑定你的应用程序和你的dll,这些地址被设置为在你的应用程序中被修复。基本上你必须每次都用新版本的dll重新编译你的程序(或者更确切的说,当你混淆数据结构时)或者使用动态加载和GetProcAddress。
确保程序集的两个版本具有AssemblyInfo.cs文件中指定的相同AssemblyVersion。
例:
[assembly: AssemblyVersion("1.0.0.0")]
我相信2008年之前VS新项目产生的默认值是:
[assembly: AssemblyVersion("1.0.0.*")]
将每次建立时自动递增程序集版本。
这对于assemblies that are signed尤其重要,因为程序集的强名称包含其版本。