添加internalLib.dll程序集引用后编译正常但运行报错
这是典型的程序集版本不匹配问题:编译时IDE能找到你本地的internalLib.dll并正常编译,但运行时.NET框架尝试加载项目配置中记录的另一版本(就是异常里的奇怪版本号),导致找不到对应文件。以下是具体解决方法:
修正项目引用的版本信息
打开你的myproject.fsproj文件,找到引用internalLib的节点,类似下面这段:<Reference Include="internalLib, Version=X.X.X.X, Culture=neutral, PublicKeyToken=xxxxxx"> <HintPath>C:\corporatelib\internalLib.dll</HintPath> </Reference>把
Version属性改成你本地internalLib.dll的实际版本号。查看版本号的方法:找到C:\corporatelib\internalLib.dll,右键→属性→详细信息,查看「文件版本」或「产品版本」。添加程序集绑定重定向
如果修改版本后还是报错,在项目的app.config文件(没有的话就新建一个)里添加重定向配置,让运行时把请求的旧版本映射到你本地的版本:<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="internalLib" publicKeyToken="异常中的十六进制公钥令牌" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-异常里的版本号" newVersion="你本地DLL的版本号" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>注意替换配置里的
publicKeyToken、oldVersion、newVersion为实际值,公钥令牌直接复制异常信息里的内容即可。确保DLL被复制到输出目录
编辑myproject.fsproj的引用节点,添加Private="True"属性,这样编译时会把internalLib.dll复制到bin/Debug或bin/Release目录:<Reference Include="internalLib, Version=你的版本号, Culture=neutral, PublicKeyToken=你的公钥令牌"> <HintPath>C:\corporatelib\internalLib.dll</HintPath> <Private>True</Private> </Reference>或者右键项目中的
internalLib引用→属性,把「复制本地」设置为True。清理全局程序集缓存(GAC)
如果公司曾经把旧版本的internalLib安装到GAC中,.NET会优先从GAC加载,导致找不到本地版本。打开管理员权限的命令提示符,运行:gacutil /u internalLib(如果找不到
gacutil,可以去C:\Program Files (x86)\Microsoft SDKs\Windows\vX.X\Bin目录查找,X.X对应你的.NET SDK版本)
内容的提问来源于stack exchange,提问作者Denis

