【问题标题】:Can not add python.dll as reference to Visual Studio project无法添加 python.dll 作为对 Visual Studio 项目的引用
【发布时间】:2019-04-04 06:51:41
【问题描述】:

我正在使用 Visual Studio 在 C# 中创建一个应用程序,该应用程序将运行一些 Python 脚本并获取它们的返回值。为此,我想使用 Python.Net(或 Python for .Net)。我通过 anaconda 安装了 Python.Net。

但是如果我运行程序,我会收到找不到 python36.dll 的错误:

    System.DllNotFoundException: Unable to load DLL 'python36': 
    The specified module could not be found

如果我想加载 anaconde 的 python36.dll 作为对我的项目的引用,我会得到:

    Reference "C:\Programm Files (x86\Micrtosoft\Visual Studio\Shared\Anaconde3_64\python36.dll" can't be 
    added, Please make sure that the file is accessible and that it is 
    a valid assembly or COM component.

我尝试使用以下方式注册 dll:

    regsvr32 

也没有用。

【问题讨论】:

  • 可以选择在机器上定期安装 python 吗?这样我就不用Anacondas python了?

标签: c# python visual-studio python.net


【解决方案1】:

最后我找到了解决方案/解决方法。这个错误似乎是 Python.Net 更常见的问题,他们在他们的 github 站点上解决了一些问题 (https://github.com/pythonnet/pythonnet/issues/708)

        var pythonPath = @"C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python3_64";

        Environment.SetEnvironmentVariable("PATH", $@"{pythonPath};" + Environment.GetEnvironmentVariable("PATH"));
        Environment.SetEnvironmentVariable("PYTHONHOME", pythonPath);
        Environment.SetEnvironmentVariable("PYTHONPATH ", $@"{pythonPath}\Lib");

        PythonEngine.PythonHome = @"C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64";
        using (Py.GIL())
        {
            dynamic np = Py.Import("numpy");
            Console.WriteLine(np.cos(np.pi * 2));
        }

【讨论】:

  • 我应该在哪里添加这段代码?我是 c# 和 VS 的新手,请多多包涵。
【解决方案2】:

根据this post

该文件是本机 DLL,这意味着您无法通过添加引用将其添加到 .NET 项目...您可以通过 DllImport 使用它 看, http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx

示例 -DllImportAttribute 属性以导入 Win32 MessageBox 函数。

using System;
using System.Runtime.InteropServices;

class Example
{
        // Use DllImport to import the Win32 MessageBox function.
        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

        static void Main()
        {
            // Call the MessageBox function using platform invoke.
            MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
        }
}

【讨论】:

  • 我也找到了这个帖子,但这不是只导入一个函数吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 2012-11-29
  • 1970-01-01
  • 2021-12-06
  • 2012-10-11
相关资源
最近更新 更多