1

在问题中:Idiomatic way to write .NET interop function我发现以下代码段:

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

当我启动 REPL 并输入:

(导入'(System.IO StreamReader))

一切正常。但是当我输入时:

(导入'(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>

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

4

1 回答 1

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
于 2013-01-24T05:06:10.710 回答