This issue is best illustrated by example:
I have the following C# code compiled into a dll
namespace Sample
{
public struct MutableStruct
{
public uint ui1;
public long l2;
public int i3;
public ulong ul4;
}
}
And then invoking it from IronRuby
require 'sample.dll'
100.times do |i|
s = Sample::MutableStruct.new
s.ui1 = 20
if s.ui1 != 20
puts "FAILED AT ITERATION #{i}"
puts "<MutableStruct ui1=#{s.ui1} l2=#{s.l2} ui3=#{s.i3} ul4=#{s.ul4}>"
end
end
And here is the output from running this small sample program multiple times:
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 34
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 34
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 34
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 34
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 93
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 34
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
C:\Dev\sample> ir .\tmp.rb
FAILED AT ITERATION 34
<MutableStruct ui1=0 l2=0 ui3=0 ul4=0>
C:\Dev\sample> ir .\tmp.rb
As you can see, IronRuby will mostly succeed, but sometimes, seemingly at random, it will simply not assign values to this mutable struct.