14

I'd like to use an API from R that is only available in .NET. Is there a standard method that can be used to call .NET C# code from R? If so, how can I do so?

Dave
  • 2,386
  • 1
  • 20
  • 38

2 Answers2

14

Another option that readers of this discussion might consider is the rClr package, which I have been working on for a couple of years to access arbitrary .NET code from R. It is a sibling of R.NET which, conversely, is a way to access R from .NET.

To give a flavour of the rClr package, the canonical "Hello World" looks like:

library(rClr)
clrLoadAssembly('c:/path/to/myassembly.dll')
myObj <- clrNew('MyNamespace.MyClass,MyAssemblyName')
clrCall(myObj, 'SayHelloWorld')

Feedback and suggestions welcome via the web site.

Jeremy Thompson
  • 61,933
  • 36
  • 195
  • 321
j-m
  • 1,473
  • 1
  • 13
  • 17
  • 2
    Wow - downloaded it and it worked absolutely perfectly!! This package is simply amazing, I look forward to using it a lot in the future. Keep up the good work! – Contango Oct 01 '13 at 22:01
  • Does anyone have a simple specific example of above code? – Artiga Oct 26 '15 at 06:24
  • `library(rClr) clrLoadAssembly('C:\\__\\TstingRLib\\ClassLibrary1\\bin\\Release\\ClassLibrary1.dll') yObj <- clrNew('System.System.Text,System') Type not found: System.System.Text,System Error in clrNew("System.System.Text,System") : Type: System.ArgumentException Message: Could not determine Type from string 'System.System.Text,System' Method: System.Object CreateInstance(System.String, System.Object[]) Stack trace: at Rclr.ClrFacade.CreateInstance(String typename, Object[] arguments) in ___\AppData\Local\Temp\Rtmp2D63Nz\R.INSTALL1f3c2a50350\rClr\src\ClrFacade\ClrFacade.cs:line 316` – Artiga Oct 26 '15 at 06:32
  • suggestion for R > 4.0 ? – Salix Dec 19 '21 at 17:10
3

Exposing the .NET dll as COM dll and then calling a COM object in the dll from R seem to be the only way. And there is a package for it: http://cran.r-project.org/web/packages/rcom/rcom.pdf

If you cannot make a COM dll because it's third-party dll, you can always create a new interface-like .NET dll with COM interface where you can call actual dll.

Tae-Sung Shin
  • 20,215
  • 33
  • 138
  • 240
  • 1
    To get a list of ProgID's in the system, see http://procbits.com/2010/11/08/get-all-progid-on-system-for-com-automation/ – Contango Feb 05 '13 at 10:02