2

我有一个需要从 C++ dll 导入函数的 C# 应用程序。我使用 DLLImport 来加载函数。它在英文和中文环境下运行良好,但在法语操作系统中总是引发“未找到模块”异常。

代码快照:

[DllImport("abcdef.dll", CallingConvention = CallingConvention.StdCall)]
public static extern string Version();

请注意,模块名称中的字母已被替换,但名称本身的格式和长度相同。

和截图: 在此处输入图像描述

有任何想法吗?

4

1 回答 1

0

我已经尝试了您提出的所有方法,但是问题仍然存在。

这是可以避免该错误的另一种方法。它使用 Win32 API 加载库并找到函数的地址,然后调用它。演示代码如下:

class Caller
{
    [DllImport("kernel32.dll")]
    private extern static IntPtr LoadLibrary(String path);
    [DllImport("kernel32.dll")]
    private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);
    [DllImport("kernel32.dll")]
    private extern static bool FreeLibrary(IntPtr lib);

    private IntPtr _hModule;

    public Caller(string dllFile)
    {
        _hModule = LoadLibrary(dllFile);
    }

    ~Caller()
    {
        FreeLibrary(_hModule);
    }

    delegate string VersionFun();

    int main()
    {
        Caller caller = new Caller("abcdef.dll");
        IntPtr hFun = GetProcAddress(_hModule, "Version");
        VersionFun fun = Marshal.GetDelegateForFunctionPointer(hFun, typeof(VersionFun)) as VersionFun;
        Console.WriteLine(fun());

        return 0;
    }
}
于 2013-04-10T04:19:26.287 回答