今有应用程序 WindowsFormsApplication1 和WebService WebService1.asmx,WindowsFormsApplication1调用WebService1,引用名称为localhost。
WebService代码
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace WebApplication1
{
/// <summary>
/// WebService1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
}
}
应用程序代码
Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
localhost.WebService1 service = new WindowsFormsApplication1.localhost.WebService1();
MessageBox.Show(service.HelloWorld());
}
}
}
编译后运行,正常。
使用Dotfuscator对该应用程序进行混淆后运行,调用WebService处引发 System.Configuration.SettingsPropertyNotFoundException 异常,错误信息如下
Code
System.Configuration.SettingsPropertyNotFoundException: 没有找到设置属性“WindowsFormsApplication1_localhost_WebService1”。
在 System.Configuration.SettingsBase.GetPropertyValueByName(String propertyName)
在 System.Configuration.SettingsBase.get_Item(String propertyName)
在 System.Configuration.ApplicationSettingsBase.GetPropertyValue(String propertyName)
在 System.Configuration.ApplicationSettingsBase.get_Item(String propertyName)
在 d.b()
在 a..ctor()
在 c.a(Object A_0, EventArgs A_1)
在 System.Windows.Forms.Control.OnClick(EventArgs e)
在 System.Windows.Forms.Button.OnClick(EventArgs e)
在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
在 System.Windows.Forms.Control.WndProc(Message& m)
在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
在 System.Windows.Forms.Button.WndProc(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
从错误信息中可以看出程序运行时找不到名为“WindowsFormsApplication1_localhost_WebService1”的属性,该属性被混淆器改了名称了,所以找不到。打开Dotfuscator查看“Rename”选项卡,如下图
可以看到有读取属性WindowsFormsApplication1_localhost_WebService1的方法get_WindowsFormsApplication1_localhost_WebService1。要使混淆后的应用程序正常运行,可以选择不重命名“Settings”(选中该项即可)。另外,一样不能重命名WebService的方法,不然会引发“System.ArgumentException: xxxxxx Web 服务方法名无效。”(xxxxxx为服务方法名称)的异常。
不知是否还有更好的方法?