I'm using the latest version of ECL (which is 0.9j). The apropos example works fine, but I'm having the same problem in lispworks (personal version 5.0) I've tried sending an array back (suing list-to-rdnzl-array) instead of a string, but pretty much the same thing happens.
I've taken Iver's suggest and re-written my program to have the .net code call the callback which set the edit-box's value from within lisp, which does work. I initial tried to mimic the apropos example and use an EventHandler instead of using my callback, but for some reason, RDNZL couldn't find the EventHanlder type when I tried to import it from the System namespace.
Thank you for your help with this problem.
I initial tried to mimic the apropos example and use an EventHandler instead of using my callback, but for some reason, RDNZL couldn't find the EventHanlder type when I tried to import it from the System namespace.
Did you look in the right assembly? There is a System.dll, a System.Core.dll and mscorlib, all defining objects in the "System" namespace. This is good because - well, anyway, you can find EventHandler like this:
RDNZL-USER 110 > (import-type "System.EventHandler" (load-assembly "mscorlib")) #<RDNZL::CONTAINER System.Type #xBC2850>
RDNZL-USER 111 > (use-namespace "System")
RDNZL-USER 112 > (new "EventHandler") #<RDNZL::CONTAINER System.EventHandler #xBC4718>
IMPORT-TYPES adds the assembly-name to the type as a prefix, which is why that hurts right here; the princess is in another castle.
This thing is currently somewhat of an issue with generic types as well: In System.Core there is the Func`n type which is very convenient, but as this is defined in "System.Core.dll" and for example System.Int32 is defined in "mscorlib.dll", this does not work:
RDNZL-USER 140 > (invoke "System.Type" "GetType" "System.Func`2[System.Int32,System.Int32]") Warning: Returning NULL object from .NET call NIL
This however will work: RDNZL-USER 142 > (invoke "System.Type" "GetType" "System.Action`1[System.Int32]") #<RDNZL::CONTAINER System.Type #xBC45C8>
because both types are in mscorlib.
I'm planning to add some code to handle this case a bit more elegantly, but this perl-style hack works if this bites:
RDNZL-USER 139 > (invoke "System.Type" "GetType" (resolve-generic-type '("System.Func" "System.Int32" "System.Int32"))) #<RDNZL::CONTAINER System.Type #xBC46C8>
where resolve-generic-type ensures all types have assembly-qualified names like so:
(defun resolve-generic-type (generic-type-definition) (if (consp generic-type-definition) (let* ((type-args (rest generic-type-definition)) (args (length type-args)) (resolved-type-args (mapcar #'resolve-generic-type type-args)) (main-type-name (format nil "~a`~d" (first generic-type-definition) args)) (main-type-resolved (resolve-type-name main-type-name)) ;; The comma separates the full type name of the main type from the assembly-name, ;; we need to add the parameter-type in the middle in square parenthesis before ;; the assembly.. (comma (position #, main-type-resolved)) (pre-type-result (when comma (subseq main-type-resolved 0 comma))) (post-type-result (when comma (subseq main-type-resolved comma (length main-type-resolved))))) (if comma (format nil "~a[~{[~a]~^,~}]~a" pre-type-result resolved-type-args post-type-result) (format nil "~a[~{[~a]~^,~}]" main-type-resolved resolved-type-args))) (resolve-type-name generic-type-definition)))
Regards, Iver
The function got formatted. Here it is again:
(defun resolve-generic-type (generic-type-definition) (if (consp generic-type-definition) (let* ((type-args (rest generic-type-definition)) (args (length type-args)) (resolved-type-args (mapcar #'resolve-generic-type type-args)) (main-type-name (format nil "~a`~d" (first generic-type-definition) args)) (main-type-resolved (resolve-type-name main-type-name)) ;; The comma separates the full ;; type name of the main type from the assembly-name, ;; we need to add the parameter-type in the middle ;; in square parenthesis before the assembly.. (comma (position #, main-type-resolved)) (pre-type-result (when comma (subseq main-type-resolved 0 comma))) (post-type-result (when comma (subseq main-type-resolved comma (length main-type-resolved))))) (if comma (format nil "~a[~{[~a]~^,~}]~a" pre-type-result resolved-type-args post-type-result) (format nil "~a[~{[~a]~^,~}]" main-type-resolved resolved-type-args))) (resolve-type-name generic-type-definition)))