Не удается вызвать статический метод Clojure clr из приложения C # - PullRequest
3 голосов
/ 20 декабря 2011

Я получаю исключение Требуется ссылка на объект для нестатического поля, метода или…

вот что я пытаюсь сделать:

;; 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());
;;        }
;;    }
;;}

Но получил: Ошибка 1 Ссылка на объект требуется для нестатического поля, метода или свойства 'program.hi ()' ConsoleApplication1.

То же самое у меня здесь: https://github.com/nCdy/clojure-clr-intro/blob/master/3-calling-clojure-from-c-sharp/csharp/clj_in_csharp/Program.cs

Я использую встроенное расширение Visual Studio vsClojure . 1.1.0; Последняя версия 1.1.0, следующая за файлом GitHub readme. Возможно, мне нужно обновить его, но у меня есть небольшие локальные проблемы, из-за которых я не собираюсь создавать последний clojre-clr (я буду решать их в следующем году).

Итак, вопрос в том, как мне вызвать библиотеку clojure clr из C # и где моя проблема?

log:

'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.

1 Ответ

3 голосов
/ 20 декабря 2011

В проекте c # у вас есть ссылка на program.exe и program.clj.dll?
Если вы создаете проект clojure и запускаете его, он работает для вас?

Еще одна вещь, которую вы можете попробовать - получить последнюю двоичную сборку на https://github.com/downloads/richhickey/clojure-clr/clojure-clr-1.3.0-Debug-4.0.zip. Как только вы получите эту настройку, сделайте это:

  1. Запустите программу clojure.compile в каталоге, где находится файл program.clj.
  2. Добавьте program.exe и program.clj.dll из выходных данных шага 1 в проект C #.
  3. Сборка проекта C #.

Это должно сработать. Я построил как с использованием против clojure и так, как я показал вам выше. Я использую clojureclr 1.3

Надеюсь, это поможет, Rob

...