2011-12-20 14 views
4

私はオブジェクト参照がここは、C#アプリケーションからClojureのCLRの静的メソッドを呼び出すことはできません

は何が私がやろうとしています...非静的フィールド、メソッドのために必要とされるか、または例外取得しています:

;; Here's the program.clj file from a VsClojure project. 
;; First thing you need to do is add the :methods property 
;; which takes a of methods that are to be generated when 
;; the class is created. Here, I'm generating a static method 
;; named hi which has no parameters and returns a String. 
;; 
;; When program.hi() is called from the C# code the 
;; the clojure function -hi will be called. By default any 
;; method in the :methods vector will be mapped to a function 
;; with the same name prefixed by a -. 
(ns program 
    (:gen-class 
    :methods [ #^{:static true} [hi [] String]])) 

(defn -hi [] 
    "Hi from ClojureCLR!") 

(defn -main [& args] 
    (println "Hello world") 
    (println (-hi))) 

;; The C# code is nothing special 
;; You MUST add both the program.exe and program.clj.dll 
;; files as references in hte C# project. In addition 
;; to these assemblies you'll need to add the following 
;; assemblies which can be found in the ClojureCLR's directory: 
;; clj.gen_class.clj.dll, clojure.clr.io.clj.dll, clojure.core.clj.dll 
;; clojure.core_deftype.clj.dll, clojure.core_printl.clj.dll, 
;; clojure.core_proxy.clj.dll, clojure.genclass.clj.dll, clojure.gvec.clj.dll 


;; using System; 

;; namespace csharp 
;; { 
;; class Program 
;; { 
;;  static void Main(string[] args) 
;;  { 
;; // You can see here you'd never know this was 
;; // really a clojure function I'm calling 
;;   Console.WriteLine("p.hi => {0}", program.hi()); 
;;  } 
;; } 
;;} 

は、しかしだ:エラーオブジェクト参照が非静的フィールド、メソッド、またはプロパティ「program.hi()」ConsoleApplication1のために必要とされる1

同じことを、私はここにある:私はVisual Studioの拡張vsClojureビルドに使用していhttps://github.com/nCdy/clojure-clr-intro/blob/master/3-calling-clojure-from-c-sharp/csharp/clj_in_csharp/Program.cs

。 1.1.0; GitHubのreadmeファイルに続く最新リリースバージョン1.1.0。たぶん私はそれを更新する必要がありますが、私は最後のclojre-clrを構築しないように私にいくつかのローカルな問題があります(私は来年にそれらを解決します)。

私はどのようにC#からclojure clrライブラリを呼び出すことができますか?どこに問題がありますか?

ログ:C#プロジェクトで

'program.exe' (Managed (v2.0.50727)): Loaded 'C:\Windows\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
'program.exe' (Managed (v2.0.50727)): Loaded 'D:\nCdy\P\Clojure1\Clojure1\bin\Debug\program.exe', Symbols loaded. 
'program.exe' (Managed (v2.0.50727)): Loaded 'D:\nCdy\P\Clojure1\Clojure1\bin\Debug\Clojure.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
'program.exe' (Managed (v2.0.50727)): Loaded 'C:\Windows\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
'program.exe' (Managed (v2.0.50727)): Loaded 'C:\Windows\assembly\GAC_MSIL\System.Core\3.5.0.0__b77a5c561934e089\System.Core.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
'program.exe' (Managed (v2.0.50727)): Loaded 'D:\nCdy\P\Clojure1\Clojure1\bin\Debug\Microsoft.Scripting.ExtensionAttribute.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
'program.exe' (Managed (v2.0.50727)): Loaded 'C:\Windows\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_ru_b77a5c561934e089\mscorlib.resources.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 

答えて

4

あなたはPROGRAM.EXEとprogram.clj.dllへの参照を持っていますか?
clojureプロジェクトを単独でビルドして実行すると、それは機能しますか?

もう一つは、最新のバイナリビルドを取得することです。https://github.com/downloads/richhickey/clojure-clr/clojure-clr-1.3.0-Debug-4.0.zip。この設定をしたら、

  1. program.cljが存在するディレクトリでclojure.compileプログラムを実行します。
  2. program.exeとprogram.clj.dllを手順1の出力からC#プロジェクトに追加します。
  3. C#プロジェクトをビルドします。

これでうまくいくはずです。私はvo clojureと上記の方法で両方を構築しました。私は助けclojureclr 1.3

希望、 ロブ

+0

私は両方への参照を持っているを使用しています。私が知る限り、最初の例ではstart program.exeに、app.exeはappcrashでappクラッシュしていました。 Clojure.pomp.exe出力:D:\ nCdy \ clojure-clr-intro \ 3-calling-clojure-c-sharp \ clj \ one> Clojure.Compile.exe one にコンパイルします。 - 797ミリ秒。しかし、C#から実行しようとしているときにone.exe(appcrashのため)を実行することはできず、絶対に "非静的フィールドに必要なもの"と同じことはできません。私はより多くの情報を発見しようとします。 – Cynede

+0

あなたはあなたがそれを実行するときにあなたが得るエラーを私に見せることができますか? clojure.main.exeをエラーなく実行できますか? – Rob

+0

私はvisual studioから実行できますが、program.exeを直接実行するとkernelbase.dllでappcrashが発生します。System.TypeInitializationExceptionは処理されませんでした。メッセージ:タイプ初期化プログラム "program"が例外を投げました。私はまた、質問にローディングログを追加しました。 – Cynede

関連する問題