В настоящее время я работаю над возможностью импорта DLL, написанной на Fortran, в Visual Basic. У меня есть все основы, поэтому теперь я пытаюсь сделать это еще дальше. Название в основном говорит все, но я объясню, что я пытаюсь делать в любом случае.Возможно передать объект в качестве параметра для метода Fortran?
Для ударов и хихиканья, давайте просто предположим, что я хочу передать объект с тремя двойными значениями в нем, возможно представляя точку в пространстве в трех измерениях. В моем методе Fortran я хочу взять этот объект, распечатать значение x, а затем изменить значение x на 7.5. Вот мой код Fortran, который делает именно это.
module test
type Point
double precision x, y, z
end type Point
end module test
function ex1(ThreeDubs)
use test
type (Point) :: ThreeDubs
print *, ThreeDubs%x
ex1 = 1
return
end function
И этот код отлично работает! ... Только для структур. Другими словами, Давайте предположим, что у меня есть следующая структура и класс в VB
Public Structure StructurePoint
Public x As Double
Public y As Double
Public z As Double
End Structure
Public Class ObjectPoint
Public x As Double
Public y As Double
Public z As Double
End Class
Создание экземпляра StructurePoint дает отличные результаты: Фортран метод выводит значением х, а затем изменяет значение х. Отлично. Теперь проблема. Когда я передаю экземпляр ObjectPoint, программа выводит значение, аналогичное 1.523E-306. В основном, говоря, что местоположение, в котором он считает, что значение x находится, не является значением x. Итак, в этом мой вопрос. Возможно ли даже передать объект в библиотеку Fortran и получить доступ к нему правильно, и если да, то как мне это сделать?
Решение
Изменение декларации класса является только то, что должно быть сделано для того, чтобы передать этот объект в Fortran.
<StructLayout(LayoutKind.Sequential)> _
Public Class CustomPoint3d
Public x As Double
Public y As Double
Public z As Double
End Class
<DllImport("passPoint3d.dll")> _
Public Shared Function PrintX(ByVal point As CustomPoint3d) As Boolean
End Function
hmm, что делает тип Point в моем коде указателем, дает точные результаты. Я потрачу немного на эти ссылки, которые вы положили. Спасибо =) – AndyPerfect
OK вот еще одно предположение из другой статьи: http://msdn.microsoft.com/en-us/library/xedhyxyd(VS.71).aspx Храните «указатель» в Fortran, а в VB.Net добавьте эту строку ' _' непосредственно перед определением VB.Net 'Public Class ... '. Вы не отправили свой оператор declare: ему понадобится что-то вроде 'Declare Function ex1 Lib '???. Dll" (<[In], Out> ByVal x As ObjectPoint) Как Integer' Или 'ex1' возвращает double? –
MarkJ
Это сделало это моим хорошим сэром! Я обновлю свой код, чтобы отразить то, что решение оказалось похоже на передачу объекта Fortran. Огромное спасибо. – AndyPerfect