0

我有一个需要使用两个版本的 dll 的应用程序。我想我只需编译一次应用程序,将 exe 复制到两个目录,然后将两个版本的 dll 复制到每个目录。仅供参考,我没有对 GAC 做任何事情。但是,我在带有未编译的 dll 的版本上收到 FileLoadException。

在项目中,我将 dll 引用的“特定版本”设置为 false。但是,也许这是错误的设置。如何让它与多个版本一起使用?

4

4 回答 4

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

于 2009-11-12T15:18:40.013 回答
0

这是因为每次重新编译 dll 时,函数的地址都会改变。而且由于您在编译时将您的应用程序与您的 dll 绑定,因此这些地址将设置为在您的应用程序中固定。基本上,您必须每次使用新版本的 dll 重新编译您的程序(或者更准确地说,当您弄乱数据结构时)或使用动态加载和 GetProcAddress。

于 2009-11-12T15:19:10.903 回答
0

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

前任:

[assembly: AssemblyVersion("1.0.0.0")]

我相信在 VS 2008 之前为新项目生成的默认值是:

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

这将在每次构建时自动增加程序集版本。

这对于已签名的程序集尤为重要,因为程序集的强名称包括其版本。

于 2009-11-12T15:21:19.963 回答
0

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

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

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

这似乎有效。

于 2009-11-16T20:33:49.403 回答