forums.silverfrost.com Forum Index forums.silverfrost.com
Welcome to the Silverfrost forums
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Create Fortran Dll to be used in .NET under Window7 X64

 
Post new topic   Reply to topic    forums.silverfrost.com Forum Index -> General
View previous topic :: View next topic  
Author Message
Jeannot



Joined: 31 Jan 2011
Posts: 5
Location: Toulouse (France)

PostPosted: Mon Jan 31, 2011 5:36 pm    Post subject: Create Fortran Dll to be used in .NET under Window7 X64 Reply with quote

I write an UI with Visual Studio 2010 Express and Fortran subroutines with Plato 3
I want to call one of these routine from my .NET application
Inside this application I define :

Public Class Unmnaged
Declare Auto Sub RESOLVE Lib "D:\RESOLUTION.dll" (<[In](), Out()> ByRef kont As Integer, <[In](), Out()> ByRef mat As Integer)
End Class

Dim kont, mat(80) As Integer

and I call the routine by the following way :

Call Unmnaged.RESOLVE(kont, mat(0))


To create the RESOLUTION.Dll file I compile and link whith :

FTN95 "D:\RESOLUTION.f95"
slink RESOLUTION.opt RESOLUTION.dll

"D:\RESOLUTION.f95" is my source code written with Plato . Its begining is :
subroutine RESOLVE (kont,mat1)

INTEGER,INTENT(INOUT):: kont
INTEGER,INTENT(INOUT):: mat1( : )

The file RESOLUTION.opt contains :
dll
load RESOLUTION
exportall
archive RESOLUTION.lib
file RESOLUTION.dll

When I run the application from whithin Visual Studio 2010 Express I get the message : (originaly the message is in French ! That's my translation !)

Message: runtime met an irremediable error. The address of the error was 0x6df57e06 on the thread 0xa1c. The code of error is 0xc0000005. It is maybe about a bug in the CLR or in the portions unsafe or not verifiable of the user code. The common causes of this bug include errors of marshaling user for COM-Interop or PInvoke, errors susceptible to damage the stack.

Have somebody an idea about that ?

Thanks
Back to top
View user's profile Send private message
DrTip



Joined: 01 Aug 2006
Posts: 74
Location: Manchester

PostPosted: Mon Jan 31, 2011 7:33 pm    Post subject: Reply with quote

Jeanot

You need to target the .NET framework when compiling the ftn95. You are targeting native win32 code.

if using plato this in the drop down window that says DEBUG.

on command line

something like

FTN95 <filename> /CLR

then need to use

DB_LNK (not slink ) for final compilation.

if you want to use native code for the fortran then you need to use p/invoke in the vb.net

Carl
Back to top
View user's profile Send private message
Jeannot



Joined: 31 Jan 2011
Posts: 5
Location: Toulouse (France)

PostPosted: Mon Jan 31, 2011 11:58 pm    Post subject: Reply with quote

Thank you for your fast answer.
I tried your proposal with some "modifications". As I have .NET Framework V4, I compiled and link with the following coimmands :
FTN95 "D:\RESOLUTION.f95" /ALT_KINDS /DEFINT_KIND 4 /CLR /CLR_VER 4

dbk_link4 "D:\RESOLUTION.dll" "D:\RESOLUTION.dbk"

I get a RESOLUTION.dll file but when I run The application I get The message :
"Entry Point RESOLVE not found in "D:\RESOLUTION.dll"

I opened it with "Dependency Walker" and I found no "Export" It seems to have no entry point inside !

So My previous problem was replaced by a new one !!

PS : In my VB application I have the instruction :
Imports System.Runtime.InteropServices

Is it necessary ?
Back to top
View user's profile Send private message
DrTip



Joined: 01 Aug 2006
Posts: 74
Location: Manchester

PostPosted: Tue Feb 01, 2011 10:14 pm    Post subject: Reply with quote

The InteropServices is only required if you are interfacing with native code via com somewhere, so you probably don't need it (though you might...)

When making FTN95.net dlls you need to do one of two things
set a flag in the linker from memory I think this it is /NS

This should make all the subroutines visible from VB.NET. (i.e. all subroutines are public in object orientated speak)

Which may be what you want.
if you want to restrict which interfaces are visible to .net. then add a line to the subroutines that you want to be visible

eg

Code:

subroutine test
   ASSEMBLY_INTERFACE (NAME="HelloFromFTN95")

   write(*,*) "hello from ftn95"

end subroutine


then use the flags


dbk_link4 "D:\RESOLUTION.dll" "D:\RESOLUTION.dbk" /NS /INTERFACE_ONLY

then add your dll to your VB project. In my example the following call from VB
Code:

RESOLUTION.HelloFromFTN95()


is visible (well I have tested it with C# but it will be the same)

there is no need for the pinvoke calls you were using originally.

Carl

ps the reason that dependancywalker has no entry points is because we are making a .net library. (not a win32 app)

if you really want to do pinvoke i.e. make a win32 dll then I will think some more later.
Back to top
View user's profile Send private message
Jeannot



Joined: 31 Jan 2011
Posts: 5
Location: Toulouse (France)

PostPosted: Wed Feb 02, 2011 10:58 am    Post subject: Reply with quote

I have deleted the call to the InteropServices and I built my RESOLUTION.dll file as you explained.
This file is added as reference in my VB application but i get the following message :
"RESOLVE is not a member of RESOLUTION"
I thing I miss something HUGE ! But what ?
Back to top
View user's profile Send private message
DrTip



Joined: 01 Aug 2006
Posts: 74
Location: Manchester

PostPosted: Wed Feb 02, 2011 1:36 pm    Post subject: Reply with quote

have you commented out the

Code:

Public Class Unmnaged
Declare Auto Sub RESOLVE Lib "D:\RESOLUTION.dll" (<[In](), Out()> ByRef kont As Integer, <[In](), Out()> ByRef mat As Integer)
End Class 


statement? from the VB?

[/code]
Back to top
View user's profile Send private message
Jeannot



Joined: 31 Jan 2011
Posts: 5
Location: Toulouse (France)

PostPosted: Wed Feb 02, 2011 2:26 pm    Post subject: Reply with quote

Yes I have.
I have deleted every thing regarding my previous way of calling my external routine.
Currently I have just define my RESOLUTION.dll file as a reference for my VB application and call the routine by :
RESOLUTION.RESOLVE(kont, mat(0))
Back to top
View user's profile Send private message
DrTip



Joined: 01 Aug 2006
Posts: 74
Location: Manchester

PostPosted: Wed Feb 02, 2011 6:01 pm    Post subject: Reply with quote

are there any methods visible from VB? Do they appear in intellisensi?
in vb express or what ever?


you should have three methods two default .net methods (from memory Equals is one) and the name you put in the string

Code:

ASSEMBLY_INTERFACE (NAME="HelloFromFTN95")


in my code this was visible as


RESOLUTION.HelloFromFTN95()

from c# express as I said.

you can send me a zipped up version of your projects and I can try and get them to compile if you like.

carl
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    forums.silverfrost.com Forum Index -> General All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group