我有一个32位的dll文件(没有源代码),需要从64位的C#应用程序中进行访问。我已经阅读了这篇文章,并查看了这里对应的代码。我还阅读了这篇帖子。我不确定我是否在问正确的问题,所以请帮助我。
有三个项目: dotnetclient
,x86Library
和x86x64
。 x86x64
有一个x86LibraryProxy.cpp
,它加载了x86library.dll
并调用了GetTemperature
函数:
STDMETHODIMP Cx86LibraryProxy::GetTemperature(ULONG sensorId, FLOAT* temperature)
{
*temperature = -1;
typedef float (__cdecl *PGETTEMPERATURE)(int);
PGETTEMPERATURE pFunc;
TCHAR buf[256];
HMODULE hLib = LoadLibrary(L"x86library.dll");
if (hLib != NULL)
{
pFunc = (PGETTEMPERATURE)GetProcAddress(hLib, "GetTemperature");
if (pFunc != NULL)
dotnetclient
调用 GetTemperature
函数并打印结果:
static void Main(string[] args)
{
float temperature = 0;
uint sensorId = 2;
var svc = new x86x64Lib.x86LibraryProxy();
temperature = svc.GetTemperature(sensorId);
Console.WriteLine($"temperature of {sensorId} is {temperature}, press any key to exit...");
如果我将所有项目都构建为x86或x64,则所有内容均有效。 我得到的温度结果为
20
。 但是,整个想法是使用32位x86x64Lib.dll
。 这意味着dotnetclient
应该构建为x64,x86Library
和x86x64
应构建为x86,对吗? 如果我这样做,我得到-1
作为结果。我应该将
x86Library
和x86x64
构建为x86,将dotnetclient
构建为x64吗? 如果我这样做,那么我得到-1
的问题是什么?澄清: 提供的示例似乎仅在客户端和服务器都以32位或64位构建时才有效。 但当客户端以64位构建而服务器以32位构建时,则无效。 有人可以看一下吗?
GetTemperature
的实现将通过调用LoadLibrary(...)
来加载我的 32 位 dll,然后从该 dll 中调用正确的函数,是吗? - theateist