2009-11-12 76 views
0

我有一个应用程序,需要与两个版本的DLL工作。我想我只会编译一次该应用程序,将该exe文件复制到两个目录中,然后将这两个版本的dll复制到这些目录中的每一个。仅供参考,我没有对GAC做任何事情。但是,我得到了一个FileLoadException异常版本与它没有编译的DLL。FileLoadException与新版本的DLL

在项目中,我将“特定版本”设置为虚假的dll引用。但是,也许这是错误的设置。我如何获得这个工作与多个版本?

回答

0

我反对改变配置文件,只是因为这是我需要做的另一件事。关于不同版本的DLL的地址更改,我不认为我有这个问题,因为我实际上使用一个接口来调用我的方法。

为了提供更多的细节,我只需要在多个dll中创建一种类型的实例。从那里,我把它当作一个接口对象。所以,这里是我的解决方案:

Assembly asm = Assembly.LoadFrom("XXX.YYY.ZZZ.Bin.dll"); 
Type type = asm.GetType("MyType"); 
IMyType obj = Activator.CreateInstance(type) as IMyType; 

这似乎工作。

2

如果您所引用的程序集是强签名的,则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在运行时。

0

这是因为每次重新编译dll时,函数的地址都会改变。由于你在编译时绑定你的应用程序和你的dll,这些地址被设置为在你的应用程序中被修复。基本上你必须每次都用新版本的dll重新编译你的程序(或者更确切的说,当你混淆数据结构时)或者使用动态加载和GetProcAddress。

0

确保程序集的两个版本具有AssemblyInfo.cs文件中指定的相同AssemblyVersion。

例:

[assembly: AssemblyVersion("1.0.0.0")] 

我相信2008年之前VS新项目产生的默认值是:

[assembly: AssemblyVersion("1.0.0.*")] 

将每次建立时自动递增程序集版本。

这对于assemblies that are signed尤其重要,因为程序集的强名称包含其版本。