我有很多遗留代码,我目前使用旧版 Borland C++ 3.0 进行编译。
这段代码中有一个规则引擎,我想在 C# .NET 应用程序中提取和使用它。
问题是,如果我将规则引擎提取到它自己的 DLL 中,我希望能够从我没有时间移植的现有遗留代码和 C# .NET 应用程序中调用这个 DLL。
如果我使用旧的 Borland 编译器构建 DLL,我不知道如何从 C# .Net 项目中引用它。DllImport 失败并出现 BadImageFormatException。用谷歌搜索这个异常表明大多数人在编译一个支持 64 位的程序并将 32 位的东西加载到其中时都会遇到这个问题。问题是,我有理由确定我正在生成 16 位 DLL,而且似乎没有解决方法。
我可以下载具有 32 位编译器和链接器的较新的 Borland 5 编译器,但我仍然遇到同样的问题,所以也许我也有问题。
这是我的 C# 调用代码
[DllImport( "C:\\NSDB\\BorlandDLL\\BorlandDLL.dll", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl )]
static extern int Version();
public frmHelpAbout()
{
InitializeComponent();
lblIssueVersion.Text = + Version();
}
这是我的 DLL 代码
int Version()
{
return 93;
}
我的编译器标志和链接器标志都是完全的猜测 - 我希望这是我的主要问题
我注意到我的 DLL 代码没有用 __stdcall、extern "C" 之类的东西装饰。我似乎找不到 Borland C++ 3.0 理解的正确符号集来强制我需要的那种调用约定。
所以,问题:
1) DllImport 是否能够使用从 Borland C++ 3.0 生成的代码 1b) 如果不能,我是否能够移植代码以使用 Borland C+ 5.5.1 编译器,并让 DllImport 使用它?
2)我可以扭转这个问题吗?如果我将 DLL 代码移植到 .NET 中,我是否能够让旧的 Borland 代码调用它?
3) 你有任何其他创新的解决方案可以让我从这个旧的 Borland 项目中简单地提取我需要的代码吗?