none
IronPythonから呼び出すCLRでTypeError RRS feed

  • 質問

  • お世話になります。

    IronPythonからC#で作成したCLRを呼び出す処理を行っています。このCLRはSWIGで生成したdllのラッパーです。

    下記のソースはint型の配列を生成し(★NG★印の行で)そのポインターをラッパーに渡していますが、
    "TypeError: expected SWIGTYPE_p_int, got SWIGTYPE_p_int"が発生します。

    VArray.getPtr()単独(☆OK☆印の行)ではOKですが、なぜか、他のラッパー呼び出しと一緒にするとエラーが発生します。
    同じ処理をC#で作成してテストしましたがエラーとはなりませんでした。

    エラーとなる理由・原因が分からず困っています。どなたかこのエラーを解決する方法をご教示願います。

    動作環境はWindows7(32bit)、.NET4.0、IronPython 2.6 for .NET4.0です。


    IronPython 2.6.1 (2.6.10920.0) on .NET 4.0.30319.1
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import clr
    >>> clr.AddReferenceByPartialName("tbl")
    >>> clr.AddReferenceByPartialName("tbltil")
    >>> import tbl as tblpy
    >>> import tblutil as tblutilpy
    >>> import CTypeIntAr
    >>> VArray = CTypeIntAr(5)
    >>> print VArray
    <CTypeIntAr object at 0x000000000000002C [CTypeIntAr]>
    >>> VArrayPtr=VArray.getPtr()                ←☆OK☆
    >>> print VArrayPtr
    <SWIGTYPE_p_int object at 0x000000000000002D [SWIGTYPE_p_int]>
    >>> ret = tblpy.GetVersion(VArray.getPtr()) ←★NG★
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: expected SWIGTYPE_p_int, got SWIGTYPE_p_int
    >>> ret = tblpy.GetVersion(VArrayPtr)        ←★NG★
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: expected SWIGTYPE_p_int, got SWIGTYPE_p_int
    >>>


    参考、SWIGソースの抜粋

    /* ----------------------------------------------------------------------------
     * This file was automatically generated by SWIG (http://www.swig.org).
     * Version 1.3.40
     *
     * Do not make changes to this file unless you know what you are doing--modify
     * the SWIG interface file instead.
     * ----------------------------------------------------------------------------- */
    using System;
    using System.Runtime.InteropServices;
    public class CTypeIntAr : CType {
      private HandleRef swigCPtr;
      internal CTypeIntAr(IntPtr cPtr, bool cMemoryOwn) : base(tblutilPINVOKE.CTypeIntArUpcast(cPtr), cMemoryOwn) {
        swigCPtr = new HandleRef(this, cPtr);
      }
      internal static HandleRef getCPtr(CTypeIntAr obj) {
        return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
      }
      ~CTypeIntAr() {
        Dispose();
      }
      public override void Dispose() {
        lock(this) {
          if (swigCPtr.Handle != IntPtr.Zero) {
            if (swigCMemOwn) {
              swigCMemOwn = false;
              tblutilPINVOKE.delete_CTypeIntAr(swigCPtr);
            }
            swigCPtr = new HandleRef(null, IntPtr.Zero);
          }
          GC.SuppressFinalize(this);
          base.Dispose();
        }
      }
      public CTypeIntAr() : this(tblutilPINVOKE.new_CTypeIntAr__SWIG_0(), true) {
      }
      public CTypeIntAr(int size) : this(tblutilPINVOKE.new_CTypeIntAr__SWIG_1(size), true) {
      }
      public override int alloc_buf(int size) {
        int ret = tblutilPINVOKE.CTypeIntAr_alloc_buf(swigCPtr, size);
        return ret;
      }
      public int at(int idx) {
        int ret = tblutilPINVOKE.CTypeIntAr_at(swigCPtr, idx);
        return ret;
      }
      public int put(int idx, int val) {
        int ret = tblutilPINVOKE.CTypeIntAr_put(swigCPtr, idx, val);
        return ret;
      }
      public SWIGTYPE_p_int getPtr() {
        IntPtr cPtr = tblutilPINVOKE.CTypeIntAr_getPtr(swigCPtr);
        SWIGTYPE_p_int ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_int(cPtr, false);
        return ret;
      }
      public SWIGTYPE_p_void getVPtr() {
        IntPtr cPtr = tblutilPINVOKE.CTypeIntAr_getVPtr(swigCPtr);
        SWIGTYPE_p_void ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_void(cPtr, false);
        return ret;
      }
    }

    /* ----------------------------------------------------------------------------
     * This file was automatically generated by SWIG (http://www.swig.org).
     * Version 1.3.40
     *
     * Do not make changes to this file unless you know what you are doing--modify
     * the SWIG interface file instead.
     * ----------------------------------------------------------------------------- */
    using System;
    using System.Runtime.InteropServices;

    public class SWIGTYPE_p_int {
      private HandleRef swigCPtr;
      internal SWIGTYPE_p_int(IntPtr cPtr, bool futureUse) {
        swigCPtr = new HandleRef(this, cPtr);
      }
      protected SWIGTYPE_p_int() {
        swigCPtr = new HandleRef(null, IntPtr.Zero);
      }
      internal static HandleRef getCPtr(SWIGTYPE_p_int obj) {
        return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
      }
    }

    /* ----------------------------------------------------------------------------
     * This file was automatically generated by SWIG (http://www.swig.org).
     * Version 1.3.40
     *
     * Do not make changes to this file unless you know what you are doing--modify
     * the SWIG interface file instead.
     * ----------------------------------------------------------------------------- */
    using System;
    using System.Runtime.InteropServices;

    public class tbl {
      public static int GetVersion(SWIGTYPE_p_int anVersion) {
        int ret = tblPINVOKE.GetVersion(SWIGTYPE_p_int.getCPtr(anVersion));
        return ret;
      }

    以下、省略

    2011年4月2日 15:14

回答

  • IronPythonからC#で作成したCLRを呼び出す処理を行っています。このCLRはSWIGで生成したdllのラッパーです。

    CLR って、Common Language Runtime の略です。
    C# で作成した CLR ってのは用語の使い方を間違えていると思われます。
    (DLL の間違い?)

    下記のソースはint型の配列を生成し(★NG★印の行で)そのポインターをラッパーに渡していますが、
    "TypeError: expected SWIGTYPE_p_int, got SWIGTYPE_p_int"が発生します。

    直訳すると、「型変換エラー。SWIGTYPE_p_int が期待されているところに、SWIGTYPE_p_int を渡した」ということでしょうか。
    同じ名前なのに違うって何?って思われるかもしれませんが、実際に同じ名前の型が複数存在する状態になっているのでは?

    tblpy.GetVersion が受け取る型と、VArray.getPtr が返す型を同じ存在にしなければエラーは解消しませんので、.NET が同一の型とみなせるように再構成してください。
    少なくとも、DLL ごとに同じ名前の型が存在する状況では解消しませんので、ある DLL に共通の型をまとめて、それを参照するようにするとか。

    なお、SWIG でどうやれば解決できるか、SWIG を使ったことがない私からはアドバイスできかねますのでご容赦ください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくな
    • 回答としてマーク 山本春海 2011年4月8日 2:00
    2011年4月2日 16:03
    モデレータ
  • Azuleanさん

    ありがとうございました。解決しました。

    SWIGの出力ソースのまとめ方が間違っていました。

     

    • 回答としてマーク 山本春海 2011年4月8日 2:00
    2011年4月3日 8:37

すべての返信

  • IronPythonからC#で作成したCLRを呼び出す処理を行っています。このCLRはSWIGで生成したdllのラッパーです。

    CLR って、Common Language Runtime の略です。
    C# で作成した CLR ってのは用語の使い方を間違えていると思われます。
    (DLL の間違い?)

    下記のソースはint型の配列を生成し(★NG★印の行で)そのポインターをラッパーに渡していますが、
    "TypeError: expected SWIGTYPE_p_int, got SWIGTYPE_p_int"が発生します。

    直訳すると、「型変換エラー。SWIGTYPE_p_int が期待されているところに、SWIGTYPE_p_int を渡した」ということでしょうか。
    同じ名前なのに違うって何?って思われるかもしれませんが、実際に同じ名前の型が複数存在する状態になっているのでは?

    tblpy.GetVersion が受け取る型と、VArray.getPtr が返す型を同じ存在にしなければエラーは解消しませんので、.NET が同一の型とみなせるように再構成してください。
    少なくとも、DLL ごとに同じ名前の型が存在する状況では解消しませんので、ある DLL に共通の型をまとめて、それを参照するようにするとか。

    なお、SWIG でどうやれば解決できるか、SWIG を使ったことがない私からはアドバイスできかねますのでご容赦ください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくな
    • 回答としてマーク 山本春海 2011年4月8日 2:00
    2011年4月2日 16:03
    モデレータ
  • Azuleanさん

    ありがとうございました。解決しました。

    SWIGの出力ソースのまとめ方が間違っていました。

     

    • 回答としてマーク 山本春海 2011年4月8日 2:00
    2011年4月3日 8:37