我有一个需要使用两个版本的 dll 的应用程序。我想我只需编译一次应用程序,将 exe 复制到两个目录,然后将两个版本的 dll 复制到每个目录。仅供参考,我没有对 GAC 做任何事情。但是,我在带有未编译的 dll 的版本上收到 FileLoadException。
在项目中,我将 dll 引用的“特定版本”设置为 false。但是,也许这是错误的设置。如何让它与多个版本一起使用?
我有一个需要使用两个版本的 dll 的应用程序。我想我只需编译一次应用程序,将 exe 复制到两个目录,然后将两个版本的 dll 复制到每个目录。仅供参考,我没有对 GAC 做任何事情。但是,我在带有未编译的 dll 的版本上收到 FileLoadException。
在项目中,我将 dll 引用的“特定版本”设置为 false。但是,也许这是错误的设置。如何让它与多个版本一起使用?
如果您引用的程序集是强签名的,如果它的版本与编译时所针对的版本不同,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")]
我相信在 VS 2008 之前为新项目生成的默认值是:
[assembly: AssemblyVersion("1.0.0.*")]
这将在每次构建时自动增加程序集版本。
这对于已签名的程序集尤为重要,因为程序集的强名称包括其版本。
我反对更改配置文件,仅仅是因为这是我需要做的另一件事。关于不同版本的dll的地址更改,我认为我没有这个问题,因为我实际上是使用接口来调用我的方法。
为了提供更多细节,我只需要在多个 dll 中创建一种类型的实例。从那里,我把它当作一个接口对象。所以,这是我的解决方案:
Assembly asm = Assembly.LoadFrom("XXX.YYY.ZZZ.Bin.dll");
Type type = asm.GetType("MyType");
IMyType obj = Activator.CreateInstance(type) as IMyType;
这似乎有效。