python代码加密,打包pyd文件在C#中调用

代码加密

为什么选择pyd、dll
https://zhuanlan.zhihu.com/p/54296517

1. python->pyd

  1. cython
    a. 安装cython

    pip 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

  2. (走投无路的瞎尝试)尝试将pyd后缀改为dll,C#提示找不到entryPoint
    https://stackoverflow.com/questions/8262884/python-c-extension-use-extension-pyd-or-dll

2. python->dll

  1. cython
    需要在C++程序中将所有的函数声明,然后再打包为一个dll,工作量大,但可以成功
    https://blog.csdn.net/zmr1994/article/details/90703017
    https://www.cnblogs.com/xueliangliu/p/9375664.html
  2. IronPython3 is NOT ready for use yet
    http://www.beixiongxiong.com/repo/ironpython3/
  3. 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

  1. 使用python36内置的dll
    https://stackoverflow.com/questions/51121456/c-using-python-runtime-not-found
  2. 依赖pythonnet-master(github下载的zip)Python.Runtime项目/生成的dll
    https://blog.csdn.net/weixin_42388228/article/details/89681870
    上面两种目前正在尝试的方法均报错如下,没解决掉。。:
    Unhandled 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
    
    https://stackoverflow.com/questions/8058832/system-missingmethodexception-method-not-found?page=1&tab=votes#tab-top
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值