代码加密
为什么选择pyd、dll
https://zhuanlan.zhihu.com/p/54296517
1. python->pyd
-
cython
a. 安装cythonpip install cython
b. 准备自己的python文件,如test.py
def test(): print "Hello World!"
c. 创建setup.py
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize("test.py"))
d. 编译
test.py和setup.py放在同一个目录下,执行如下命令python setup.py install
可以看到在当前目录的build/lib.win-amd64-3.6中生成了test.cp36-win_amd64.pyd文件。
参考:https://blog.csdn.net/qq_34106574/article/details/81166062 -
(走投无路的瞎尝试)尝试将pyd后缀改为dll,C#提示找不到entryPoint
https://stackoverflow.com/questions/8262884/python-c-extension-use-extension-pyd-or-dll
2. python->dll
- cython
需要在C++程序中将所有的函数声明,然后再打包为一个dll,工作量大,但可以成功
https://blog.csdn.net/zmr1994/article/details/90703017
https://www.cnblogs.com/xueliangliu/p/9375664.html IronPython3 is NOT ready for use yet
http://www.beixiongxiong.com/repo/ironpython3/py2exe for python3.4-
https://stackoverflow.com/questions/41578808/indexerror-tuple-index-out-of-range-when-using-py2exe
C#调用pyd
1. 安装pythonnet
pythonnet可以让我们在C#中调用python代码。(我尝试用pip安装,但是出了一些问题<有兴趣可以到文章最后看看>,这里换成nuget安装)
https://www.nuget.org/packages/pythonnet_py36_win/
在上面的网址中,搜索你需要的版本的pythonnet包,如python3.7的就搜索pythonnet_py37_win。
如上图,复制这条命令在visual studio中执行,Tools -> NuGet Package Manager -> Package Manager Console
2. 在C#中调用python模块代码
在C#文件的开头加上这个namespace
using Python.Runtime;
然后就可以编写你的方法了
private void CsharpFunc() {
using (Py.GIL()) // 使用这个来包裹你调用python方法的代码
{
// 先引入python模块,也就是我们上面生成的pyd文件,如my_module.cp36-win_amd64.pyd
dynamic my_module = Py.Import("my_module");
// Call your python functions.
my_module.func(arg1, arg2);
}
// …
}
-
如果运行时报错System.BadImageFormatException:
可以尝试把你的solution platform改为你的对应平台x64或x32,而不是ANY。如果没有,就添加一个。
https://stackoverflow.com/questions/51121456/c-using-python-runtime-not-found
-
如果你的电脑上装的python环境不是直接能获取到的话(如Virtualenv、Anaconda等),还需要在C#代码中手动指定python、lib库等的位置:
private void setVirtualPythonEnv() { var pathToVirtualEnv = @"C:\Anaconda3"; Environment.SetEnvironmentVariable("PATH", pathToVirtualEnv, EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable("PYTHONHOME", pathToVirtualEnv, EnvironmentVariableTarget.Process); Environment.SetEnvironmentVariable("PYTHONPATH", $"{pathToVirtualEnv}\\Lib\\site-packages;{pathToVirtualEnv}\\Lib", EnvironmentVariableTarget.Process); }
可以参考 https://github.com/pythonnet/pythonnet/wiki/Using-Python.NET-with-Virtual-Environments
-
花絮
使用pip安装的pythonnet,报错相关Python.Runtime.dll
- 使用python36内置的dll
https://stackoverflow.com/questions/51121456/c-using-python-runtime-not-found - 依赖pythonnet-master(github下载的zip)Python.Runtime项目/生成的dll
https://blog.csdn.net/weixin_42388228/article/details/89681870
上面两种目前正在尝试的方法均报错如下,没解决掉。。:
https://stackoverflow.com/questions/8058832/system-missingmethodexception-method-not-found?page=1&tab=votes#tab-topUnhandled exception. System.MissingMethodException: Method not found: 'System.Reflection.Emit.AssemblyBuilder System.AppDomain.DefineDynamicAssembly(System.Reflection.AssemblyName, System.Reflection.Emit.AssemblyBuilderAccess)'. at Python.Runtime.CodeGenerator..ctor() … at Python.Runtime.Py.GIL() in D:\Data\python\pythonnet-master\src\runtime\pythonengine.cs:line 637