如何在C#中调用其他语言所写的DLL程序???急!!!

时间:2022-08-30 17:46:24
我是用FORTRAN来写一个计算程序并把他编译成DLL,但我想用C#来编写它的用户界面,但我怎么也不能调用这个FORTRAN写的DLL,为什么???急急急!!!!!
这几天把想的头昏脑胀的,累啊!!!!
急!!!各位高手帮帮忙啊!!!!
谢谢!!!

21 个解决方案

#1


把那个dll注册一下,c#就可以调用了

#2


注册那个dll,然后在添加引用中引用!

#3


楼上的都对

#4


好像不是所有的DLL都能引用吧,用DllImport自己写声明。

#5


上面的都对,先引用,在Using

#6


up

#7


好象不能注册啊,我试过了:
RegAsm 错误:“D:\Example\MyDesign\bin\Debug\SFR2.dll”不是有效的 .NET 程序集,
因此未能加载它
怎么办啊?

#8


而且我也用TlbImp工具来转化成CLR函数库,还是不行啊:
TlbImp error: The input file 'D:\Example\MyDesign\bin\Debug\SFR2.DLL' is not a v
alid type library
急急急!!!
谢谢!!!

#9


dll声明和调用的例子
// Declare a class member for each structure element.
[ StructLayout( LayoutKind.Sequential )]
public class SystemTime 
{
   public ushort year; 
   … 
   public ushort milliseconds; 
}

public class LibWrap 
{
   // Declare a managed prototype for the unmanaged function.
   [ DllImport( "Kernel32.dll" )]
   public static extern void GetSystemTime( [In,Out] SystemTime st );
}

#10


自己写声明吧,用DllImport

#11


怎样写啊??
能不能来一个例子啊??
急,谢谢!!!

#12


你看看.net自带的例子吧
Microsoft Visual Studio .NET\FrameworkSDK\Samples\Technologies\Interop\PlatformInvoke\WinAPIs

#13


把你的Dll接口函数如果方便的话给大家列出来,好让大家给你试试。

#14


不好意思,我的帮助看不了,呵呵……
能帖出来吗??
急!!!

#15


接口函数是用FORTRAN编写的,不是用.NET写的!
怎么办啊??

#16


PROGRAM FEM802

OPEN(5,FILE='INT.DAT',STATUS='OLD')
OPEN(6,FILE='OUT.LIS',STATUS='NEW')

CALL INPUT
CALL STIFS
CALL LOADS
CALL LDLTS
CALL STRES

CLOSE(5)
CLOSE(6)
STOP
END

#17


如果你用VC或VB调用你的Dll,怎么写?给大家列出来。

#18


如下是FindFile API的声明
// Copyright
// Microsoft Corporation
// All rights reserved

// FindFile.cs

using System;
using System.Runtime.InteropServices;

/*
typedef struct _WIN32_FIND_DATA 
{
  DWORD    dwFileAttributes; 
  FILETIME ftCreationTime; 
  FILETIME ftLastAccessTime; 
  FILETIME ftLastWriteTime; 
  DWORD    nFileSizeHigh; 
  DWORD    nFileSizeLow; 
  DWORD    dwReserved0; 
  DWORD    dwReserved1; 
  TCHAR    cFileName[ MAX_PATH ]; 
  TCHAR    cAlternateFileName[ 14 ]; 
} WIN32_FIND_DATA, *PWIN32_FIND_DATA; 
*/

[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Auto )]
public class FindData 
{
public int fileAttributes = 0;

// creationTime was embedded FILETIME structure
public int creationTime_lowDateTime = 0 ;
public int creationTime_highDateTime = 0;

// lastAccessTime was embedded FILETIME structure
public int lastAccessTime_lowDateTime = 0;
public int lastAccessTime_highDateTime = 0;

// lastWriteTime was embedded FILETIME structure
public int lastWriteTime_lowDateTime = 0;
public int lastWriteTime_highDateTime = 0;

public int nFileSizeHigh = 0;
public int nFileSizeLow = 0;
public int dwReserved0 = 0;
public int dwReserved1 = 0;

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=256 )]
public String fileName = null;

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=14 )]
public String alternateFileName = null;
}

public class LibWrap
{
//HANDLE FindFirstFile(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData);

[ DllImport( "Kernel32.dll", CharSet=CharSet.Auto )]
public static extern IntPtr FindFirstFile( String fileName, [ In, Out ] FindData findFileData );
}

public class App
{
public static void Main()
{
FindData fd = new FindData();
IntPtr handle = LibWrap.FindFirstFile( "C:\\*.*", fd );

Console.WriteLine( "The first file: {0}", fd.fileName );
}
}


#19


你用vs.net studio 中的 项目--添加引用---com 然后掉用你的那个文件就行了

#20


用COM的思想。编一个你要调用的哪个DLL(B)的外壳(A)来包装它,在外壳(A)的构造函数里调用这个.dll(B)的构造函数,并声明B的所有方法,虚的。还要在A中声明一个占位成员,如
char[100]  space;//space 的大小一定要大于或等于B占用的空间。将A编译成DLL,必须是VC环境,这个新DLL一定可以在C#中用的,呵呵,有时Game软件的外挂或修改器就是这么做的。

#21


用csc进行编译!
EXAMPLE:csc /out:要输出的文件的位置和文件名 /in(好象是的):要编译成DLL文件的位置和文件名。
然后再在Global的文件中修改在〈assemmlyes>〈/assemmlyes>中添加〈add assemmly〉dll的文件名〈/assemmly〉
在要使用的地方用using语句就好了;!!!
有些地方我记的也不太清楚,但过程就是这样的!!!!!!!!!!!!!

#1


把那个dll注册一下,c#就可以调用了

#2


注册那个dll,然后在添加引用中引用!

#3


楼上的都对

#4


好像不是所有的DLL都能引用吧,用DllImport自己写声明。

#5


上面的都对,先引用,在Using

#6


up

#7


好象不能注册啊,我试过了:
RegAsm 错误:“D:\Example\MyDesign\bin\Debug\SFR2.dll”不是有效的 .NET 程序集,
因此未能加载它
怎么办啊?

#8


而且我也用TlbImp工具来转化成CLR函数库,还是不行啊:
TlbImp error: The input file 'D:\Example\MyDesign\bin\Debug\SFR2.DLL' is not a v
alid type library
急急急!!!
谢谢!!!

#9


dll声明和调用的例子
// Declare a class member for each structure element.
[ StructLayout( LayoutKind.Sequential )]
public class SystemTime 
{
   public ushort year; 
   … 
   public ushort milliseconds; 
}

public class LibWrap 
{
   // Declare a managed prototype for the unmanaged function.
   [ DllImport( "Kernel32.dll" )]
   public static extern void GetSystemTime( [In,Out] SystemTime st );
}

#10


自己写声明吧,用DllImport

#11


怎样写啊??
能不能来一个例子啊??
急,谢谢!!!

#12


你看看.net自带的例子吧
Microsoft Visual Studio .NET\FrameworkSDK\Samples\Technologies\Interop\PlatformInvoke\WinAPIs

#13


把你的Dll接口函数如果方便的话给大家列出来,好让大家给你试试。

#14


不好意思,我的帮助看不了,呵呵……
能帖出来吗??
急!!!

#15


接口函数是用FORTRAN编写的,不是用.NET写的!
怎么办啊??

#16


PROGRAM FEM802

OPEN(5,FILE='INT.DAT',STATUS='OLD')
OPEN(6,FILE='OUT.LIS',STATUS='NEW')

CALL INPUT
CALL STIFS
CALL LOADS
CALL LDLTS
CALL STRES

CLOSE(5)
CLOSE(6)
STOP
END

#17


如果你用VC或VB调用你的Dll,怎么写?给大家列出来。

#18


如下是FindFile API的声明
// Copyright
// Microsoft Corporation
// All rights reserved

// FindFile.cs

using System;
using System.Runtime.InteropServices;

/*
typedef struct _WIN32_FIND_DATA 
{
  DWORD    dwFileAttributes; 
  FILETIME ftCreationTime; 
  FILETIME ftLastAccessTime; 
  FILETIME ftLastWriteTime; 
  DWORD    nFileSizeHigh; 
  DWORD    nFileSizeLow; 
  DWORD    dwReserved0; 
  DWORD    dwReserved1; 
  TCHAR    cFileName[ MAX_PATH ]; 
  TCHAR    cAlternateFileName[ 14 ]; 
} WIN32_FIND_DATA, *PWIN32_FIND_DATA; 
*/

[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Auto )]
public class FindData 
{
public int fileAttributes = 0;

// creationTime was embedded FILETIME structure
public int creationTime_lowDateTime = 0 ;
public int creationTime_highDateTime = 0;

// lastAccessTime was embedded FILETIME structure
public int lastAccessTime_lowDateTime = 0;
public int lastAccessTime_highDateTime = 0;

// lastWriteTime was embedded FILETIME structure
public int lastWriteTime_lowDateTime = 0;
public int lastWriteTime_highDateTime = 0;

public int nFileSizeHigh = 0;
public int nFileSizeLow = 0;
public int dwReserved0 = 0;
public int dwReserved1 = 0;

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=256 )]
public String fileName = null;

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=14 )]
public String alternateFileName = null;
}

public class LibWrap
{
//HANDLE FindFirstFile(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData);

[ DllImport( "Kernel32.dll", CharSet=CharSet.Auto )]
public static extern IntPtr FindFirstFile( String fileName, [ In, Out ] FindData findFileData );
}

public class App
{
public static void Main()
{
FindData fd = new FindData();
IntPtr handle = LibWrap.FindFirstFile( "C:\\*.*", fd );

Console.WriteLine( "The first file: {0}", fd.fileName );
}
}


#19


你用vs.net studio 中的 项目--添加引用---com 然后掉用你的那个文件就行了

#20


用COM的思想。编一个你要调用的哪个DLL(B)的外壳(A)来包装它,在外壳(A)的构造函数里调用这个.dll(B)的构造函数,并声明B的所有方法,虚的。还要在A中声明一个占位成员,如
char[100]  space;//space 的大小一定要大于或等于B占用的空间。将A编译成DLL,必须是VC环境,这个新DLL一定可以在C#中用的,呵呵,有时Game软件的外挂或修改器就是这么做的。

#21


用csc进行编译!
EXAMPLE:csc /out:要输出的文件的位置和文件名 /in(好象是的):要编译成DLL文件的位置和文件名。
然后再在Global的文件中修改在〈assemmlyes>〈/assemmlyes>中添加〈add assemmly〉dll的文件名〈/assemmly〉
在要使用的地方用using语句就好了;!!!
有些地方我记的也不太清楚,但过程就是这样的!!!!!!!!!!!!!