Установка массива с использованием Ruby и Win32OLE

Я пытаюсь установить свойство массива в COM-объект, используя Ruby v1.93. Распределение массива из COM в массив Ruby просто работает, но не в другом направлении. Как маршалировать массив Ruby в COM?

Свойство содержится в сборке.NET:

namespace LibForRuby
{
   public class MyClass
   {
      public MyClass()
      {
         MyInt = 1;
         MyArray = new[] {2, 3};
      }

      public int MyInt { get; set; }
      public int[] MyArray { get; set; }
   }
}

Весь мой рубиновый скрипт:

require 'win32ole'

com_class = WIN32OLE.new('LibForRuby.MyClass')

puts 'Before:'
my_int = com_class.MyInt
puts my_int
my_array = com_class.MyArray
print my_array
puts

puts 'After:'
com_class.MyInt = 10
my_int = com_class.MyInt
puts my_int
com_class.MyArray = [20,30]
my_array = com_class.MyArray
print my_array

Выход:

C:\Ruby193\bin>test
Before:
1
[2, 3]
After:
10
C:/Ruby193/bin/test.rb:13:in `method_missing': (in setting property `MyArray': )
 (WIN32OLERuntimeError)
    OLE error code:0 in <Unknown>
      <No Description>
    HRESULT error code:0x80020005
      Type mismatch.
        from C:/Ruby193/bin/test.rb:13:in `<main>'

2 ответа

Попробуй это:

puts 'After:'
com_class.MyInt = 10
my_int = com_class.MyInt
puts my_int
com_class._setproperty(
com_class.ole_method_help('MyArray').dispid,
[[20,30]], 
[WIN32OLE::VARIANT::VT_ARRAY]
)
my_array = com_class.MyArray
print my_array

Обязательно найдите метод #_setproperty на ruby-doc.org, чтобы увидеть, почему ваш массив заключен в массив и почему константа варианта находится внутри массива.

Немного опоздал, но у меня возникла та же проблема при попытке установить ключ System.Security.Cryptography.TripleDESCryptoServiceProvider так как я реализую какой-то алгоритм шифрования в рубиновом движке без OpenSSL

Это не работает:

crypto = WIN32OLE.new("System.Security.Cryptography.TripleDESCryptoServiceProvider")
crypto.key = [62,116,108,70,56,97,100,107,61,51,53,75,123,100,115,97]

Это работает:

arr = [1,2,3,4]
crypto = WIN32OLE.new("System.Security.Cryptography.TripleDESCryptoServiceProvider")
vArr = WIN32OLE_VARIANT.array([arr.length],WIN32OLE::VARIANT::VT_UI1)
arr.each_with_index {|val,index| vArr[index]=val}
crypto.key = vArr
Другие вопросы по тегам