100¥悬赏一个问题解决办法(C#)

目前在做一个关于N卡超频的代码,已经借用了


但是在实际使用过程中,调用nvml.dll的时候出现错误(此处代码完整的复制过来无任何改动)
且参考的程序bin文件夹下无nvml.dll(已自己解决)

img

在使用copy来尝试复制该dll则出现以下提示(仍需要解决)

img

使用参考的软件,则正常访问,copy。

首先项目平台要一致(百度到的代码 Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),需要区分32位与64位)
再进一步缩减代码,做一个小demo(问题简单化)就知道代码究竟错在哪里

应该是nvml引用了其他的dll,你拷贝的时候并没有一起拷贝过去。所以不建议拷贝,直接在原来的位置上面调用。
下面是dependency walker简单查看dll内部情况,而且还是我拷贝到桌面,少调用一些找不到dll的额情况了

img

img

这个容易,
你的程序提示“无法在 DLL“XXX.dll”中找到名为“XXX函数”的入口点”这个错误,你可以考虑考虑看看你的dll有木有这个函数

你C盘那个路径下有这个dll吗,没有吧

试一下项目那里右键“管理NUGet程序包”,然后搜索nvml下载,点击安装,然后在项目根目录下的package文件夹里找到nvml.dll复制到输出目录

可能需要注册一下dll regsvr32

比较可能是DLL文件和执行程序的32位/64位问题。

如果本目录没有nvml.dll,则不需要system32下面的nvml.dll。也不需要在代码里面自己拷贝。放好需要的dll就行。你目前的情况应该是缺少dll而在代码里面copy,而copy中又发生缺少文件的情况导致的。

1、先将nvml.dll从C盘复制到你的项目中的一个lib文件夹。
2、引用这个dll.
3、通过这个方法加载dll

  /// <summary>
        /// 获取服务类&方法
        /// </summary>
        /// <param name="serviceName"></param>
        /// <returns></returns>
        private object GetService(string serviceName)
        {
            object res = null;
            switch (serviceName)
            {
                case "SecurityService":
                    res = new SecurityService();
                    break;
                default:
                    Type type = System.Reflection.Assembly.Load("Bingosoft.Metro.Mobile").GetType("Bingosoft.Metro.Mobile." + serviceName);
                    if (type != null)
                        res = type.Assembly.CreateInstance(type.FullName);
                    else
                        res = null;
                    break;
            }
            return res;
        }