PHP如何调用C# dll 类库?我来告诉你
有的时候,我们需要在php中利用到其他语言编写的dll类库,如C#编写的dll,方法就是利用PHP new COM方法来调用,在调用之前先要把dll库注册并把程序集放入到全局缓存中。
1. 创建一个 C# Class Library ,命名为:HelloWorld
2. 打开项目的属性,在点选左边的 "Application"(就是第一个tab) , 然后点击 Assembly Information 按钮 , 在弹出的Dialog中, 必须在底部勾上: Make assembly COM-visible !否则 , 这个dll将不能以COM方式访问 . ( 也可以在代码中的类声明中写上[ComVisible(true)] , 效果一样,需要增加using System.Runtime.InteropServices;引用)
3. 创建强命名签名文件并使用
使用vs.net的“Vsitual Studio .Net工具”-->Vistual Studio .Net命令提示符,输入 sn -k d:HelloWorld.snk 回车即创建了强命名签名文件
打开项目的属性,点选左边Signing 勾上Sign the assembly 在 Choose a strong name key file:处选择 选择刚才创建的HelloWorld.snk文件
4. 创建类库并编译成dll
namespace HelloWorld
{
//[ComVisible(true)] //or check "Assembly COM-Visible" at Application-Assembly_Information dialog ;
public class Hello
{
public string Write()
{
return "Hello World";
}
}
}
5. 找到dll文件夹路径 ,然后使用vs.net的“Vsitual Studio .Net工具”-->Vistual Studio .Net命令提示符
进入该dll文件夹下输入:
regasm HelloWorld.dll<回车>
这时候,这个.dll的.net程序集就变成一个标准的Com组件了,但是还不能用,必须让它变成全局Com组件.
将程序集添加到全局程序集缓存中
进入提示符窗口,输入:
gacutil /I HelloWorld.dll<回车>
这时,你的这个dll就被复制到全局程序集缓存中了.也就是说无论在这个电脑的哪个硬盘上都可以使用此dll组件了.
如果不进行强命名签名,这一步会提示加载失败
PHP测试
<?php
$r=new Com("HelloWorld.Hello");
$s=$r->Write();
echo $s;
?>
命令符下:
CD [/D] [drive:][path] #进入指定路径
CD [..] #返回父目录
下面就简单说说如何利用 zend guard进行加密我们的php源代码。
目前zend guard最新的版本是 6.0,下载地址:http://www.zend.com/en/products/guard/downloads
详细的英文文档说明在这里:http://files.zend.com/help/Zend-Guard/zend-guard.htm#install.htm
【注意】:使用zend guard加密后的代码在执行php脚本的时候需要加载解码器:Zend Guard Loader,注意版本的一致。
设置 Zend Guard Loader 的方法请见本文最后部分。
目前,zend guard 6.0 支持 php5.3和php5.4两个版本。
打开 zend guard 6.0 界面如下:
如果你没有注册,显示的是 Trial Version 试用版。mac系统下是没有破解版的,不过win下是有的,怎么去找,你懂的。
试用版在加密的时候,会提示:
** WARNING **
Working in trial mode - Cannot find the license file: zend_guard.zl (path was: /Applications/Zend Guard 6.app/Contents/Resources/plugins/com.zend.guard.core.resources.macosx_6.0.0.201305051344/resources).
that will expire after 14 days !
** WARNING **
试用版:
1、加密的代码不会优化;
2、加密的文件14天后过期;
3、如果使用license授权,license 3天后过期。
license 界面:
当启用了license,我们需要先生成一个 license key,然后再生成 license。
生成的license授权文件后缀是 .zl,比如 test1.zl,里面的内容大致如下:
Product-Name = test1
Registered-To = test1.com
Hardware-Locked = No
Com = www.Piaoyi.org
Expires = 28-Jan-2015
Produced-By = Zend Encoder trial
Verification-Code = wG5ff2uhlyRRrgS8JeqQLEbEpL+rAhQTMVHXZq+9PYFkxV0BfDxID3Cl6Q==
当启用了license授权后,在php.ini就需要配置 zend_loader.license_path= 的值了。比如:
zend_loader.license_path=/Users/CCMAC/Zend/test1/test1.zl
如果不配置 license路径,就是提示php警告:
PHP Warning: No license for this product (test1) - make sure zend_loader.license_path is properly configured in your ini file! in /Users/CCMAC/php/zend/1.php on line 0
PHP Warning: License check failed! in /Users/CCMAC/php/zend/1.php on line 0
混淆设置如下:
更多待补充。。。。。
如何为 php 服务器安装 zend guard loader 的说明:
MAC下的安装步骤(参考):
1、下载 Zend Guard Loader 6.0.0 (for PHP 5.3 or 5.4) ,网址: http://www.zend.com/en/products/guard/downloads
文件是:Zend Guard Loader (Runtime for PHP 5.4) 6.0.0,类型:DMG。
Mac下载地址:http://downloads.zend.com/guard/6.0.0/ZendGuardLoader-70429-PHP-5.4-darwin10.7-x86_64.tar.gz
2、从压缩包里提取 ZendGuardLoader.so (Linux) or ZendLoader.dll (Windows) ;
mac下的ZendGuardLoader.so,只有3.3版本的。
3、编辑php配置文件 'php.ini' :
zend_extension = /usr/local/lib/php/ZendGuardLoader.so ##路径根据实际情况而定
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path=
4、如果你同时使用 Zend debugger,请确保在 Zend Guard Loader 加载之后加载.
5、如果你使用 ioncube loader,请确保在 Zend Guard Loader 加载之前加载.
6、重启 Web server.
安装完毕后,用 phpinfo() 函数查看,有这类描述:“ with Zend Guard Loader v3.3”,出现下图即为成功:
注意:MAC os x目前已经没有了32位的版本,新出的都是64位。因此,在MAC下安装了php5.3之后,再到zend官网去找 ZendGuardLoader.so,你会发现zend根本就没有出 64位版本的 ZendGuardLoader.so,只有32位的,这个时候,如果你强行引用32位的 ZendGuardLoader.so for mac php5.3,就会出现下列错误:
Failed loading /usr/local/lib/php/php53/ZendGuardLoader.so: dlopen(/usr/local/lib/php/php53/ZendGuardLoader.so, 9): no suitable image found. Did find:
/usr/local/lib/php/php53/ZendGuardLoader.so: mach-o, but wrong architecture
这个错误,官方回复说无解,此路不通。
At present we only support 32 bit on the Mac for backward compatibility. In the next major version we will probably move to 64 bit only. . You're simplest solution might be to download Zend Server CE for the Mac and get a complete 32 bit stack.
Wappalyzer是一个Firefox扩展,在网络上跟踪软件分发,并告诉您的维基,留言板等在页面上您目前使用。 本文我们来讨论如何使用Wappalyzer API进行Web应用指纹识别。Web应用指纹识别,是web渗透信息收集最关键的一步,这方面开源的工具也非常多,像BlindElephant,whatweb 以及在非安全圈都很火的wappalyzer。本文主要描述如何使用wappalyzer的perl与php接口进行指纹识别。
Wappalyzer的功能是识别单个uri的指纹,其原理就是给指定URI发送HTTP请求,获取响应头与响应体并按指纹规则进行匹配。这也是 web应用指纹识别最基础的部分,除此之外,还有指纹置信度计算(如何去处伪造指纹,多种指纹特征如何综合判断,隐藏指纹信息如何提取),整个站点的指纹识别还涉及到有效爬虫抓取,分布式计算等问题,这些都不在本文内容中。
FreeBuf小科普:了解wappalyzer
Wappalyzer是一款浏览器插件,通过Wappalyzer可以识别出网站采用了那种web技术。它能够检测出CMS和电子商务系统、留言板、javascript框架,主机面板,分析统计工具和其它的一些web系统。The company behind Wappalyzer还能够收集web程序的一些信息用于统计分析,揭示出各种web系统的使用率即增长情况。实际Wappalyzer就是一个指纹识别工具。更多信息请点击:http://www.freebuf.com/tools/7391.html
官方地址:https://wappalyzer.com/
一、perl版本
原理:
给指定uri发送HTTP请求,通过分析HTTP相应的以下部分来判断指纹
(1) headers特征
响应头key:value对,多个key:value用逗号隔开,例如
"headers": { "X-AMP-Version": "([d.]+);version:", "Set-Cookie": "^AMP=" },
(2) html特征
响应体内容,多个规则用逗号隔开,例如
"html": [ "
特别注意:html全文匹配的规则一定要谨慎编写
(3) url特征
url内容,例如
"url": "/cgi-bin/UCEditor?(?:.*&)?merchantid=."
(4) meta特征
响应html 页面中诸如中的名字name:内容content对,多个规则用逗号隔开,例如
"meta": { "generator": "webEdition", "DC.title": "webEdition" }
(5) script特征
响应html页面中诸如 src中中url内容,多个规则用逗号隔开,例如
"script": [ "angular(?:-|.)([d.]*d)[^/]*.js;version:", "/([d.]+(-?rc[.d]*)*)/angular(.min)?.js;version:", "angular.*.js" ]
局限性:
不支持规则文件中APP版本号与置信度的获取
对非utf8的中文编码可能会存在问题
优点:
较之PHP版本,使用qr正则预编译处理,可以提前发现正则的问题,这是我选择该语言版本的主要原因。
(接下来的php版本就能让你知道正则不预编译处理有多坑了!)
脚本的功能:
(1)指纹识别结果按JSON格式返回,以便后续指纹信息入库等处理
(2)支持批量uri查询
(3)支持指定自定义JSON格式的指纹规则文件
(默认的指纹文件放置在/usr/lib/perl5/WWW/apps.json ,具体的路径会因cpan模块的安装路径有区别
可以使用perl -V 察看@INC变量来确定路径,或者更暴力的find吧)
安装:
cpan -i WWW::Wappalyzer
clone https://github.com/tanjiti/FingerPrint.git
运行:
(1)获取单个uri的指纹
perl FingerPrint.pl www.xxx.com tanjiti.json[指纹规则文件,可选]
返回结果
{
"www.xxx.com": {
"blogs": [
"WordPress"
],
"web-servers": [
"Nginx"
],
"cdn": [
"CloudFlare"
],
"cms": [
"WordPress"
],
"font-scripts": [
"Google Font API"
],
"javascript-frameworks": [
"jQuery"
],
"javascript-graphics": [
"Javascript Infovis Toolkit"
]
}
}
(2) 从文件读取url列表进行批量指纹识别,并将结果输出到文件中
perl FingerPrint.pl url.txt tanjiti.json[指纹规则文件,可选]
结果输出到 url.txt__fingerprint 文件里
指纹规则文件编写示例:
more tanjiti.json
"apps": {
"Discuz!":{
"website": "www.discuz.net/forum.php",
"cats": [ 1 ],
"meta": { "generator": "Discuz"},
"headers": {"Set-Cookie": "_lastact.*_sid|_sid.*_lastact|_sid.*smile|smile.*_sid"},
"url": "/uc_server[/$]|uc_client[/$]",
"html": "Powered by (?:Discuz!|<a href="http://www.discuz.net/"|UCenter)",
"implies": "php"
},
"PHP": {
"website": "php.net",
"cats": [ 27 ],
"headers": { "Server": "php/?([d.]+)?;confidence:40;version:", "X-Powered-By": "php/?([d.]+)?;confidence:40;version:", "Set-Cookie": "PHPSESSID" },
"url": ".php(?:$|?)"
}
}
二、php版本
原理
同perl版本,区别有两点:
1. HTTP请求部分:较之perl使用LWP发送HTTP请求,php使用curl发送HTTP请求
2. 规则匹配部分:指纹规则的匹配部分使用javascript语法,然后通过php的v8js模块来解析。(为什么要这样做呢?当返回响应体内容很多,指纹正则写的很烂的时候,会卡死在规则匹配这一过程中,现在的规则下sina,163等大站基本卡死!)
运行
PHP版的接口已经能直接使用了,只是需要替换规则文件,??/p>
第一步:安装php、curl及v8js
apt-get install php5-dev php-pear build-essential libv8-dev php5-curl
pecl install channel://pecl.php.net/v8js-0.1.3
echo extension=v8js.so >> /etc/php5/cli/php.ini
验证是否安装成功
php -m | grep v8js
v8js -----------OK
第二步:下载Wappalyzer脚本
git clone https://github.com/ElbertF/Wappalyzer.git
cp -R Wappalyzer/drivers/php/* .
cp Wappalyzer/share/js/wappalyzer.js js/
cp Wappalyzer/share/apps.json . (指纹规则文件) 该规则文件的正则编写的有问题,所以我使用的以前版本的规则文件cp /usr/lib/perl5/WWW/apps.json .
php版指纹识别程序结构如下:
index.php 主程序
Wappalyzer.php
WappalyzerException.php
js/driver.js js/wappalyzer.js
apps.json 指纹规则文件
第三步:验证是否成功
php index.php www.tanjiti.com
输出格式为
应用名,版本号,置信度,app类型 (比perl版本多了对版本号,置信度的获取)
CloudFlare, , 100%, cdn
Javascript Infovis Toolkit, , 100%, javascript-graphics
jQuery, , 100%, javascript-frameworks
Nginx, , 100%, web-servers
PHP, 5.5.9, 100%, programming-languages
Ubuntu, , 100%, operating-systems
WordPress, 4.0, 100%, cms, blogs
接下来的优化输出为json格式与批量处理uri同perl版本。
最后寄言,一定一定要写好正则,NFA引擎正则优化TIPS、Perl正则技巧及正则性能评测方法
网站采集功能现在多半会使用火车头这些软件来实现了,但是对于一些定时或小的采集我们可以使用程序来实现,在php中curl是当选的一个函数了,下面一起来看看curl网站采集的实现程序吧.选择curl的理由
关于curl与file_get_contents,摘抄一段通俗易懂的对比:
file_get_contents其实是一堆内置的文件操作函数的合并版本,比如file_exists,fopen,fread,fclose,专门提供给懒人用的,而且它主要是用来对付本地文件的,但又是因为懒人的原因,同时加入了对网络文件的支持;
curl是专门用来进行网络交互的库,提供了一堆自定义选项,用来应对不同的环境,稳定性自然要大于file_get_contents。
使用方法
1、开启curl支持
由于php环境安装后默认是没有打开curl支持的,需修改php.ini文件,找到;extension=php_curl.dll,把前面的冒号去掉,重启服务即可;
2、使用curl进行数据抓取
// 初始化一个 cURL 对象
$curl = curl_init();
// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, 'http://www.111cn.net');
// 设置header
curl_setopt($curl, CURLOPT_HEADER, 1);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// 运行cURL,请求网页
$data = curl_exec($curl);
// 关闭URL请求
curl_close($curl);
3、通过正则匹配找到关键数据
//$data是curl_exec返回的的值,即采集的目标内容
preg_match_all("/<li class=\"item\">(.*?)<\/li>/",$data, $out, PREG_SET_ORDER);
foreach($out as $key => $value){
//此处$value是数组,同时记录找到带匹配字符的整句和单独匹配的字符
echo '匹配到的整句:'.$value[0].'
';
echo '单独匹配到的:'.$value[1].'
';
}
技巧
1、超时的相关设置
通过curl_setopt($ch, opt) 可以设置一些超时的设置,主要包括:
CURLOPT_TIMEOUT 设置cURL允许执行的最长秒数。
CURLOPT_TIMEOUT_MS 设置cURL允许执行的最长毫秒数。 (在cURL 7.16.2中被加入。从PHP 5.2.3起可使用。 )
CURLOPT_CONNECTTIMEOUT 在发起连接前等待的时间,如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS 尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。 在cURL 7.16.2中被加入。从PHP 5.2.3开始可用。
CURLOPT_DNS_CACHE_TIMEOUT 设置在内存中保存DNS信息的时间,默认为120秒。
curl_setopt($ch, CURLOPT_TIMEOUT, 60); //只需要设置一个秒的数量就可以
curl_setopt($ch, CURLOPT_NOSIGNAL, 1); //注意,毫秒超时一定要设置这个
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); //超时毫秒,cURL 7.16.2中被加入。从PHP 5.2.3起可使用
2、通过post提交数据,保留cookie
//以下摘抄一个例子过来,用于学习借鉴:
//Curl 模拟登录 discuz 程序,适合DZ7.0
!extension_loaded('curl') && die('The curl extension is not loaded.');
$discuz_url = 'http://www.111cn.net';//论坛地址
$login_url = $discuz_url .'/logging.php?action=login';//登录页地址
$get_url = $discuz_url .'/my.php?item=threads'; //我的帖子
$post_fields = array();
//以下两项不需要修改
$post_fields['loginfield'] = 'username';
$post_fields['loginsubmit'] = 'true';
//用户名和密码,必须填写
$post_fields['username'] = 'lxvoip';
$post_fields['password'] = '88888888';
//安全提问
$post_fields['questionid'] = 0;
$post_fields['answer'] = '';
//@todo验证码
$post_fields['seccodeverify'] = '';
//获取表单FORMHASH
$ch = curl_init($login_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
curl_close($ch);
preg_match('/<input\s*type="hidden"\s*name="formhash"\s*value="(.*?)"\s*\/>/i', $contents, $matches);
if(!empty($matches)) {
$formhash = $matches[1];
} else {
die('Not found the forumhash.');
}
//POST数据,获取COOKIE
$cookie_file = dirname(__FILE__) . '/cookie.txt';
//$cookie_file = tempnam('/tmp');
$ch = curl_init($login_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_exec($ch);
curl_close($ch);
//带着上面得到的COOKIE获取需要登录后才能查看的页面内容
$ch = curl_init($get_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
$contents = curl_exec($ch);
curl_close($ch);
var_dump($contents);
在使用curl 中有一些心得给各位分享一下
编码转换
首先通过查看源代码找到采集的网站使用的编码,通过mb_convert_encoding函数进行转码;
具体使用方法:
//源字符是$str
//以下已知原编码为GBK,转换为utf-8
mb_convert_encoding($str, "UTF-8", "GBK");
//以下未知原编码,通过auto自动检测后,转换编码为utf-8
mb_convert_encoding($str, "UTF-8", "auto");
3、为更好地避开换行符和空格等不定因素的阻碍,有必要先清除采集到的源码中的换行符、空格符和制表符
//方法一,使用str_replace进行替换
$contents = str_replace("\r\n", '', $contents); //清除换行符
$contents = str_replace("\n", '', $contents); //清除换行符
$contents = str_replace("\t", '', $contents); //清除制表符
$contents = str_replace(" ", '', $contents); //清除空格符
//方法二,使用正则表达式进行替换
$contents = preg_replace("/([\r\n|\n|\t| ]+)/",'',$contents);
4、通过正则表达式匹配找出需要获得的代码段,使用preg_match_all实现该匹配
函数解释:
int preg_match_all ( string pattern, string subject, array matches [, int flags] )
pattern即正规表达式
subject即要进行查找的原文
matches是用于储存输出结果的数组
flags是储存的模式,包括:
PREG_PATTERN_ORDER; //整个数组是二维数组,$arr1[0]是包括边界所构成匹配字符串的数组,$arr1[1]除去边界所构成的匹配字符串的数组
PREG_SET_ORDER; //整个数组是二维数组,$arr2[0][0]是第一个包括边界所构成的匹配的字符串,$arr2[0][1]是第一个除去边界所构成的匹配的字符串,之后的数组以此类推
PREG_OFFSET_CAPTURE; //整个数组是三维数组,$arr3[0][0][0]是第一个包括边界所构成的匹配的字符串,$arr3[0][0][1]是到达第一个匹配字符串的边界的偏移量(边界不算在内),之后以此类推,$arr2[1][0][0]是第一个包括边界所构成的匹配的字符串,$arr3[1][0][1]是到达第一个匹配字符串的边界的偏移量(边界算在内);
//实际应用
preg_match_all('/<pclass=\"content\">(.*?)<\/p>/',$contents, $out, PREG_SET_ORDER);
$out将获取到所有匹配的元素
$out[0][0]将是包括<pclass=\"content\"></p>在内的全段字符
$out[0][1]将是仅包括(.*?)括号内所匹配到的字符段
//如此类推,第n个匹配到的字段可以用以下方法取得
$out[n-1][1]
//若正则表达式中存大多个括号,则取得句中第m个匹配点的方法是
$out[n-1][m]
5、取得要找到字符后,若要去掉html标签,使用PHP自带的函数strip_tags即可方便地实现
//例
$result=strip_tags($out[0][1]);
上面只是把数据采集下载了,当然最好我们需要把$contents内容进入库处理了,这里就是简单的php数据查询保存的功能了,非常简单.
下面来看一个我们在生活中常碰到的一个php实现微信红包的程序算法,希望这个程序对各位做微信开的朋友会带来帮助.最近一直在微信群里体验红包功能,红包类型有
•普通红包
•拼手气红包两种
普通红包就不用多解析了,大锅饭原理,平分。
拼手气红包讲的是手气(运气),有人可以抢到很多,有人抢的少得可怜,当然也不是先抢就一定多,说到底了就是随机。
想了想,自己写写看,能不能实现类似的功能(不敢说是算法)。
// $bonus_total 红包总金额
// $bonus_count 红包个数
// $bonus_type 红包类型 1=拼手气红包 0=普通红包
function randBonus($bonus_total=0, $bonus_count=3, $bonus_type=1){
$bonus_items = array(); // 将要瓜分的结果
$bonus_balance = $bonus_total; // 每次分完之后的余额
$bonus_avg = number_format($bonus_total/$bonus_count, 2); // 平均每个红包多少钱
$i = 0;
while($i<$bonus_count){
if($i<$bonus_count-1){
$rand = $bonus_type?(rand(1, $bonus_balance*100-1)/100):$bonus_avg; // 根据红包类型计算当前红包的金额
$bonus_items[] = $rand;
$bonus_balance -= $rand;
}else{
$bonus_items[] = $bonus_balance; // 最后一个红包直接承包最后所有的金额,保证发出的总金额正确
}
$i++;
}
return $bonus_items;
}
好吧,我们现在来体验一下
// 发3个拼手气红包,总金额是100元
$bonus_items = randBonus(100, 3, 1);
// 查看生成的红包
var_dump($bonus_items);
// 校验总金额是不是正确,看看微信有没有坑我们的钱
var_dump(array_sum($bonus_items));
另一个使用数组实现的版本,原理差不多:
function sendRandBonus($total=0, $count=3, $type=1){
if($type==1){
$input = range(0.01, $total, 0.01);
if($count>1){
$rand_keys = (array) array_rand($input, $count-1);
$last = 0;
foreach($rand_keys as $i=>$key){
$current = $input[$key]-$last;
$items[] = $current;
$last = $input[$key];
}
}
$items[] = $total-array_sum($items);
}else{
$avg = number_format($total/$count, 2);
$i = 0;
while($i<$count){
$items[] = $i<$count-1?$avg:($total-array_sum($items));
$i++;
}
}
return $items;
}
相关文章
- 这篇文章主要介绍了Spring AOP 对象内部方法间的嵌套调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-29
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 这篇文章主要介绍了c# 三种方法调用WebService接口的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-07
- 这篇文章主要介绍了js实现调用网络摄像头及常见错误处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-07
- 这篇文章介绍了c#动态调用Webservice的两种方法实例,有需要的朋友可以参考一下...2020-06-25
- 这篇文章主要介绍了解决Vue watch里调用方法的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-07
- 这篇文章主要给大家介绍了关于c#中的WebService及其调用方式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了解决vue watch数据的方法被调用了两次的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-07
- 下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 本文章来给大家详细介绍在php中如何来调用执行mysql存储过程然后返回由存储过程返回的值了,有需要了解的同学可进入参考。 。调用存储过程的方法。 a。如果存储过...2016-11-25
- 我们要明确,为什么要进行异步回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不动了,不响应了...2020-06-25
- 这篇文章主要介绍了C#调用python脚本的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了javascript实现方法调用与方法触发小结的相关资料,需要的朋友可以参考下...2016-03-30
- 方法一:直接调用复制代码 代码如下:<? /******************************************************************************/ /* 文件名 : soapclient.php /* 说 明 : WebService接口客户端例程 /****************...2014-06-07
- 下面小编就为大家分享一篇基于C#调用c++Dll结构体数组指针的问题详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
- 下面小编就为大家带来一篇C# Soap调WebService的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了Python调用.NET库的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-05-09
- 下面小编就为大家分享一篇基于C#调用OCX控件的常用方法推荐,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
- 访问一个类的私有成员不是什么好做法,大家也都知道私有成员在外部是不能被访问的,这篇文章主要给大家介绍了关于C#访问及调用类中私有成员与方法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#调用摄像头实现拍照功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08