如何在U-SQL项目中重定向程序集版本?解决依赖版本冲突问题
解决U-SQL中Newtonsoft.Json版本冲突的程序集重定向方案
这个版本冲突问题在U-SQL里挺常见的,尤其是内置组件和自定义代码依赖同一类库的不同版本时。别担心,确实可以通过程序集绑定重定向来解决,我给你一步步拆解可行的方案:
1. 先把统一版本的Newtonsoft.Json注册到Catalog里
首先得确定你要统一用哪个版本的Newtonsoft.Json,比如选一个兼容JsonExtractor和自定义处理器的稳定版本。把这个版本的DLL注册到你的U-SQL数据库Catalog中,如果还没注册,用这段脚本:
CREATE ASSEMBLY [Newtonsoft.Json] FROM '<你的Newtonsoft.Json.dll本地路径/ADLS存储路径>' WITH ADDITIONAL_FILES = ( '<对应的Newtonsoft.Json.xml文档路径>' ); -- 可选,加这个能支持IntelliSense
如果之前已经注册过其他版本,要么覆盖掉,要么用强名称区分,但更建议直接统一到一个版本,减少后续麻烦。
2. 在脚本里添加绑定重定向规则
在U-SQL脚本的最开头,先引用你要统一的Newtonsoft.Json版本,然后通过ALTER ASSEMBLY强制JsonExtractor使用这个版本:
-- 先引用目标版本的Newtonsoft.Json REFERENCE ASSEMBLY [Newtonsoft.Json] VERSION '13.0.1.0'; -- 替换成你实际要用的版本号 -- 给JsonExtractor添加绑定重定向,让它指向我们指定的版本 ALTER ASSEMBLY [Microsoft.Analytics.Samples.Formats.Json.JsonExtractor] WITH BINDING = 'Newtonsoft.Json, Version=13.0.1.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed';
这里的PublicKeyToken是Newtonsoft.Json官方包的固定公钥令牌,不用改,只需要对应调整版本号就行。
3. 让自定义处理器也对齐同一版本
回到你的自定义处理器项目,把NuGet里的Newtonsoft.Json版本改成和上面统一的那个,重新编译后,再把自定义处理器的DLL注册到Catalog时,明确引用我们统一的版本:
CREATE ASSEMBLY [YourCustomProcessor] FROM '<自定义处理器编译后的DLL路径>' REFERENCE ASSEMBLY [Newtonsoft.Json];
额外小提示
- 如果是在Azure Data Lake Analytics(ADLA)上运行,要确保所有DLL都上传到ADLS的正确路径,脚本里的路径要对应上。
- 官方的Newtonsoft.Json NuGet包是带强名称的,用这种版本做重定向会更稳定,尽量别用无强名称的自定义编译版本。
- 要是不确定冲突的具体依赖关系,可以查系统视图看看:
SELECT * FROM sys.assembly_references WHERE assembly_name = 'Microsoft.Analytics.Samples.Formats.Json.JsonExtractor';
内容的提问来源于stack exchange,提问作者Rui Fernandes
相关产品推荐
相关产品推荐

