Преобразование Fortran DLL в VB.NET DLL

Основной вопрос: Если я не могу изменить вызывающую процедуру из вызывающей программы, могу ли я все же перевести исходный исходный код DLL с Fortran 77 на VB.Net? То есть, можно ли заставить DLL, написанную на VB.NET, вести себя идентично той, исходный код которой изначально был написан на Fortran 77?

Я знаю, что столкнусь с проблемами со строками. Но ни одна из моих процедур не будет иметь ввода / вывода строк, только 4-байтовые целые числа и 8-байтовые двойники.

Мне нужно изменить DLL, изначально написанную на Fortran 77. Чтобы упростить любые будущие изменения, я хотел бы перевести исходный код DLL с Fortran на VB.Net. Я не могу изменить программу, которая вызывает DLL, и у меня нет кода для программы, которая вызывает DLL, поэтому я не знаю, как он ее вызывает. Прежде всего, возможно ли то, что я пытаюсь сделать? Я думаю, это потому, что DLL - это DLL независимо от исходного языка, не так ли? Вот где я нахожусь:

Исходный код Fortran выглядит так:

    subroutine init(dwid)

    use dfport
    implicit none
    common /fltcmn/ ifirst, icnt
    integer ifirst, icnt
    integer(4) dwid
    external fndndx
cDEC$ ATTRIBUTES C, REFERENCE, DLLEXPORT, ALIAS:'_INIT' :: INIT

    [code in here w/ return]

    end subroutine init


    function fndndx(dwid)

    use dfport
    implicit none
    common /fltcmn/ ifirst, icnt
    integer ifirst, icnt, fndndx
    integer(4) dwid

    [code in here w/ return]

    end function fndndx

А теперь следует моя попытка перевести его (который сейчас не работает)

    Public Class Class1
        Public ifirst as Integer
        Public icnt as Integer

        Sub init(ByVal dwid as Integer)

            [Code in here w/ return]

        End Sub

        Function fndndx(ByVal dwid as Integer) as Integer

            [Code in here w/ return]

        End Function

    End Class

Я почти уверен, что [код здесь с возвратом] верен, поскольку это основные логические утверждения. Однако в чем я не уверен, так это в том, правильно ли я имею дело с «общими» операторами Фортрана и нормально ли иметь функции и подпрограммы внутри «класса» ...


person Esteban    schedule 20.08.2013    source источник
comment
Вы говорите, чтобы облегчить будущие изменения. Но что, скорее всего, будет иметь будущее и широко распространено? Фортран или VB? VB родился в 1991 году. Fortran удалось продержаться еще 40 лет, это активно улучшаемый стандарт (Fortran 66, 77, 90, 95, 2003, 2008 и предстоящий 2015 год), есть много компиляторов, на которые можно положиться, а не только один, и есть хорошие бесплатные компиляторы (gfortran, open64) ... Да, и, кстати, если это DLL, то она может быть связана с VB, да и с чем угодно, переводить особо не нужно.   -  person    schedule 20.08.2013
comment
Вы хотите сказать, что это исходный код FORTRAN, и что [Код здесь с возвратом] компилируется и действительно что-то делает? Ну ... прошло много времени с тех пор, как я в последний раз кодировал FORTRAN, но у меня сложилось впечатление, что этот код ничего не делает. Что касается классов, это вообще не сделка; они просто контейнеры, которые в худшем случае вам нужно будет просто включить в свои вызовы.   -  person varocarbas    schedule 20.08.2013
comment
@arbautjc Я имел в виду, что для таких пользователей, как я, проще, с большим опытом работы с vb.net. Как бы сильно я ни хотел научиться говорить на Фортране, времени не так уж много. Код решает не математические задачи, а логические утверждения, приводящие к действиям в программе, которая, на мой взгляд, в этом аспекте более удобна для пользователя.   -  person Esteban    schedule 20.08.2013
comment
@arbautjc хорошие слова, но вы, похоже, не пытались адаптировать программу, полностью выполненную на FORTRAN, к современным ОС, программам и т. д. Не говоря уже о мелочах, связанных с отсутствием какой-либо поддержки / возможностей интерфейса. Это хороший вычислительный движок, возможно, лучший (именно потому, что в нем нет ничего, кроме основ), но его нельзя использовать автоматически, по крайней мере, на коммерческом уровне. С другой стороны, вы сталкиваетесь с неприятной реальностью, когда вам приходится писать код без какой-либо визуальной помощи при работе над более или менее сложными проектами.   -  person varocarbas    schedule 20.08.2013
comment
@varocarbas Я упустил некоторые важные утверждения? Я попытался сделать представительный краткий пример моей проблемы. Исходный код Fortran при компиляции как DLL работает должным образом. В исходном коде Fortran есть процедуры, которые вызываются другой программой. Подпрограммы имеют определенные имена с известным типом / длиной входных / выходных данных.   -  person Esteban    schedule 20.08.2013
comment
@varocarbas. Думаю, вы давно не видели Фортран. Кто просит автономные программы? Здесь Эстебану нужна DLL, которая, я считаю, не слишком автономна. С ISO_C_BINDING в настоящее время нет проблем с интерфейсом (и, если вы сомневаетесь, приведенный выше код находится в Fortran 90).   -  person    schedule 20.08.2013
comment
Вы все упустили. Это просто объявление группы переменных; но вы с ними ничего не делаете, так что ... Но я не думаю, что вы можете публиковать здесь целые коды и просить конверсию. Вы должны быть в состоянии придумать большую часть этого и задать вопросы по конкретным вопросам. В случае, если у вас нет слишком большого опыта, просто конвертируйте построчно все в исходном коде, пока не достигнете точки, с которой вы не можете справиться, и тогда будет смысл спросить здесь (кому-то более знающему, чем я).   -  person varocarbas    schedule 20.08.2013
comment
@esteban. Если код Fortran не обрабатывает числа, вы правы, возможно, стоит его перевести. ОБЩИЕ переменные распределяются между программными модулями, которые их используют. Это похоже на глобальные переменные, поэтому я думаю, что использование переменных класса - это нормально (мой VB плох, но если я здесь, они являются переменными экземпляра, поэтому они будут использоваться только между методами, а не между объектами).   -  person    schedule 20.08.2013
comment
@varocarbas, думаю, мой самый большой вопрос - правильная ли структура. Как я уже упоминал, [код] довольно просто перевести. Просто программа, которая читает подпрограммы из dll, их не находит.   -  person Esteban    schedule 20.08.2013
comment
@arbautjc, я думаю, вы устраняете некоторые из моих затруднений. Да, будет несколько экземпляров dll, которыми основная программа управляет с помощью упомянутой мной переменной dwid (я не уверен, правильно ли я это описываю). Что было бы vb.net эквивалентом переменных, которые совместно используются экземплярами dll? (если есть?)   -  person Esteban    schedule 20.08.2013
comment
Хм, вы имеете в виду экземпляры класса (т.е. объекты), а не экземпляры DLL? Даже в Фортране (потому что он действительно зависит от ОС), если две программы загружают одну и ту же DLL, их адресное пространство не объединяется, если вы не используете специальные приемы.   -  person    schedule 20.08.2013
comment
@arbaujtc Да, экземпляры объекта.   -  person Esteban    schedule 20.08.2013
comment
@varocarbas, значит, если я не могу изменить вызывающую программу, я не могу изменить исходный язык DLL? Нет возможности сделать одинаковые Dll из Fortran и Vb.net?   -  person Esteban    schedule 20.08.2013
comment
Когда вы вызываете DLL, вы должны следовать определенным правилам (а целевое приложение должно поддерживать язык, в данном случае .NET). Также у вас есть проблема различий между FORTRAN (который, по-видимому, включает только функции напрямую) и VB.NET, у которого есть пространство имен (а затем класс); все это может быть объяснено вызывающей программой. Если у вас нет доступа к вызывающей программе (если она не встроена в .NET), возможно, вам не стоит преобразовывать библиотеку.   -  person varocarbas    schedule 20.08.2013
comment
Идентичный, боюсь, что это невозможно. С VB.NET вы учитываете всю платформу .NET (чего нет в FORTRAN). Вы можете провести быстрое исследование, ища способы вызвать DLL, созданную на языке X, из языка Y; всегда есть разные кусочки и кусочки. А при работе с .NET необходимо поддерживать .NET. С другой стороны, он не обязательно должен быть идентичным, потому что вызывающая программа может поддерживать оба (и вы можете найти способ компенсировать различия). Но отсутствие доступа к источнику вызывающей программы, безусловно, является проблемой.   -  person varocarbas    schedule 20.08.2013
comment
Просто будьте проще: что вам нужно сделать в первую очередь при вызове DLL в .NET (из .NET)? Если добавить ссылку / пространство имен, это самая заметная часть любой программы .NET. В ФОРТРАНЕ этого нет. Просто забудьте обо всех других потенциальных проблемах, как теперь вы можете узнать, что вызывающая программа должна включать пространство имен? До сих пор он выполнял: init, а теперь должен выполнять NameSpace.init или добавить ссылку на Namespace + init ... Только этот бит имеет значение. Посмотрите на это с другой стороны: визуализируйте программу, загружающую файл для запуска, что произойдет, если вы измените имя файла?   -  person varocarbas    schedule 20.08.2013
comment
Наконец, я хочу настаивать на том, что я никогда не пробовал это (и, честно говоря, не хочу делать это сейчас); и я не говорю, что обходного пути нет. Я говорю о том, что априори может быть довольно много проблем (которых можно было бы избежать / уменьшить в случае доступа к источнику вызывающей программы), и что вызывающая программа поддерживает / может иметь дело, имеет значение. .   -  person varocarbas    schedule 20.08.2013
comment
@varocarbas, боюсь, это проблема, с которой я столкнулся. Что программа вызывает init, а не Class1.init. Вызывающая программа, с которой я имею дело, - это проприетарная программа небольшой компании, которая все еще находится в разработке [но со старыми остатками], поэтому документации по этому поводу не так много. Спасибо за подсказки и помощь!   -  person Esteban    schedule 20.08.2013
comment
@arbautjc, спасибо за комментарии и помощь!   -  person Esteban    schedule 20.08.2013
comment
Вы можете попробовать собрать свой код F77 с помощью чего-то вроде компилятора Silverfrost, у которого есть интерфейс .net, и использовать генерируемую им dll.   -  person cup    schedule 24.08.2013
comment
Взгляните на support.microsoft.com/kb/817248. Это для DLL VB.net, используемых в VB6. Это будет похоже на использование библиотек DLL на других языках.   -  person cup    schedule 27.08.2013


Ответы (1)


Я думаю, ответ - «ты не можешь этого сделать». Насколько я могу судить, показываемая вами DLL возвращает информацию в основную программу, изменяя переменные в общем блоке. Но в .NET этого нет.

person dmm    schedule 16.09.2013