[Ironruby-core] InternalsVisibleTo

andrew Wilson a.wilson82 at gmail.com
Sat Jan 16 03:41:03 EST 2010


Jimmy,

So I decided to debug this out a bit for myself.  Before I go too far, here
is how my require headers are setup:

require 'System.Xml.Linq, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089'
require 'System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089'
require 'System.Data, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089'
require 'System.Xml, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089'
require 'System.Drawing, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a'
require 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089'
require
'C:\Users\pinvoke\Desktop\Rspec_Project_Runner\cmd_parser\bin\Debug\CmdParser.dll'
require
'C:\Users\pinvoke\Desktop\Rspec_Project_Runner\rspec_project_runner\bin\Debug\rspec_project_runner.exe'

Inside of my IronRuby specs, there is a call that, in ruby looks like this:

        rargs = ['-o', 'C:\Users\pinvoke']
        args = System::Array[System::String].new(rargs)
        p = Rspec::Project::Runner::ProgramArguments.Parse(args)

The call to assign the results of Parse to P always fails unless I

a) Do what Ivan suggested and copy to the bin folder
b.) Modify ir.exe.config to include the path to the actual .dll

-

I was reading the source code this evening and noticed that during the
RubyContext buildup it only includes the following paths to resolve
references:

context.Loader.GetLoadPathStrings()
{string[4]}
    [0]: "F:/ironruby-ironruby-178b744/Merlin/Main/Languages/Ruby/libs/"
    [1]:
"F:/ironruby-ironruby-178b744/Merlin/External.LCA_RESTRICTED/Languages/Ruby/redist-libs/ruby/site_ruby/1.8/"
    [2]:
"F:/ironruby-ironruby-178b744/Merlin/External.LCA_RESTRICTED/Languages/Ruby/redist-libs/ruby/1.8/"
    [3]: "."

I assumed this is was why if I dump my .dll into any of those paths it
resolves.

Then when I looked at the loaded files, everything looked like it loaded
correctly:

    [2]: "System.Xml.Linq, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"
    [3]: "System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"
    [4]: "System.Data, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"
    [5]: "System.Xml, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"
    [6]: "System.Drawing, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
    [7]: "System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"
    [8]:
"C:\\\\Users\\\\pinvoke\\\\Desktop\\\\Rspec_Project_Runner\\\\cmd_parser\\\\bin\\\\Debug\\\\CmdParser.dll"
    [9]:
"C:\\\\Users\\\\pinvoke\\\\Desktop\\\\Rspec_Project_Runner\\\\Specs\\\\CmdParser_spec_helper.rb"
    [10]:
"C:\\\\Users\\\\pinvoke\\\\Desktop\\\\Rspec_Project_Runner\\\\rspec_project_runner\\\\bin\\\\Debug\\\\rspec_project_runner.exe"
    [11]: "rspec_project_runner_spec_helper.rb"

Here is where it gets fun!

The problem appears to be in the way IronRuby is resolving assembly
references from other already loaded assemblies.  That is, if I make the
above spec calls (rargs /args/ p) the application blows up w/o the CmdParser
assembly in the path.  The thing is that all the .Parse(args) method call is
doing is a wrapper to call into another assembly... the one that blows up as
not being found.

So, I decided to see what happened if I call the methods from the CmdParser
assembly directly and... everything works fine.  Regardless of which path
the file is in :)

If I wasn't so tired I would try and trace back how the resolve was working
and why it wasn't checking the loaded files... however I am exhausted and
it's way past my bed time.

If this helps, here is the Fusion Log that got dumped:

=== Pre-bind state information ===
LOG: User = veritas\pinvoke
LOG: DisplayName = CmdParser, Version=1.5.0.0, Culture=neutral,
PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///F:/ironruby-ironruby-178b744/Merlin/Main/bin/Debug/
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file:
F:\ironruby-ironruby-178b744\Merlin\Main\bin\Debug\ir.exe.Config
LOG: Using machine configuration file from
C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom,
partial, or location-based assembly bind).
LOG: The same bind was seen before, and was failed with hr = 0x80070002.

-Andrew







-- 
When I wrote this, only God and I understood what I was doing.  Now, God
only knows - Karl Weierstrass
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20100116/85c8138b/attachment-0001.html>


More information about the Ironruby-core mailing list