如何在Clojure-CLR 1.4.1中使用.NET WebClient调用

时间:2013-01-22 05:25:37

标签: clojure clojureclr

在问题中:Idiomatic way to write .NET interop function我找到了以下代码段:

(import '(System.Net HttpWebRequest NetworkCredential)
        '(System.IO StreamReader))

当我启动REPL并输入:

  

(import'(System.IO StreamReader))

一切都好。但是当我进入时:

  

(import'(System.Net HttpWebRequest))

(我不需要NetworkCredential功能)我得到:

My.ns=> (import '(System.Net HttpWebRequest))
Bad type
NullReferenceException Object reference not set to an instance of an object.  cl
ojure.lang.Util.NameForType (D:\work\clojure-clr-1.4.1-fix\Clojure\Clojure\Lib\U
til.cs:729)

哦,我以前做过:

My.ns=> (System.Reflection.Assembly/LoadWithPartialName "System.Net")
#<RuntimeAssembly System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b
03f5f7f11d50a3a>

那我还需要做什么?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

这是1.4中的错误。它来自于不能正确处理可从多个组件访问的类型。在这种情况下,System.Net.HttpWebRequest位于System程序集中。在加载System.Net程序集之前导入该类可以正常工作。加载System.Net程序集后,可以从两个程序集访问HttpWebRequest(感谢TypeForwardedTo中的System.Net属性)。在ClojureCLR 1.4.1中,处理不当。

解决方案:

  1. 要么不加载System.Net,要么导入HttpWebRequest 在这之前。
  2. 下载最新版本的ClojureCLR - 错误是固定的。
  3. 如果您需要继续使用1.4.1并且可以构建它 你自己,这是一个单行修复。看着 https://github.com/clojure/clojure-clr/commit/38c34c2a60a63d5933386e412a250c5e8b879d5b