PostSharp Essentials破解教程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/catshitone/article/details/88806330

因为PostSharp有些版本一直都是收费的,所以项目里用的都是Essentials版。虽然功能都是一样的,但还是有一些限制,比如每个project里使用postsharp的地方不能有超过10个class,每个solution里不能超过50个class。
之前这些限制倒没怎么影响到我,但随着项目越来越大,50个class已经不够用了。

该怎么办呢? 网上搜了下破解方法,有的干脆不能用、有的会影响到VS的稳定、有的还需要收费。这就郁闷了,我的需求很简单,就是把50个class的限制去掉而已,还得浪费这么久的时间去测试这些破解版的可用性和稳定性?
所以还不如自己搞:

开搞

突破口

如果超过50个类,编译时vs会报这么一个错误:

License error. The project uses non-licensed features. It is not allowed to enhance or analyze more than 50 classes in each solution by features not covered by the installed licenses. Please visit http://www.postsharp.net/purchase to acquire a license of PostSharp.

以此为突破口,我们先找到PostSharp在哪里做了这个50的限制,然后将50改大一点说不定就解决了这个问题。

开始改

打开dnSpy反编译工具,将下面这些PostSharp相关的dll文件全部拖进去反编译:
在这里插入图片描述
(这里因为我项目里主要用的是4.3.33版本的PostSharp,所以以4.3.33版本为例)

反正一共也就这么多,在dnSpy里搜索这个字符串“by features not covered by the installed licenses”。最后定位到是PostSharp.Compiler.Engine.dll这个文件,从文件名上来看我们的破解方向应该是对的。
CoreMessageSource类里定义了这个字符串:
在这里插入图片描述
并且case 243,然后经过一步步跟踪和猜测,我们发现如果代码哪里有“PS0243”这个字符串,则表示哪里会获取这个case为243的文本。然后在dnSpy里又是一通搜索,终于找到了使用PS0243的地方:
在这里插入图片描述
(原来是LocalLicenseManger这个类)。
然后我们在这个方法里看到了这么一段逻辑:

bool flag = this.^lZuYeJkX.^RAVPSLQi() > 10;
bool flag2 = num3 > 50;
if (flag || flag2)
{
    LicensingTrace.Licensing.WriteLine("There are {0} types enhanced or analyzed for free in the project (instead of max. {1}) and {2} in the solution (instead of max. {3}).", new object[]
	{
        this.^lZuYeJkX.^RAVPSLQi(),
		10,
		num3,
		50
	});
	if (LicensingTrace.Licensing.IsEnabled)
	{
        LicensingTrace.Licensing.WriteLine("The project uses licensed features.", new object[0]);
		if (flag)
		{
			LicensingTrace.Licensing.WriteLine("List of classes enhanced or analyzed in the current project: ", new object[0]);
			foreach (MetadataDeclaration metadataDeclaration in this.^lZuYeJkX.^iQXnqWh2())
			{
				LicensingTrace.Licensing.WriteLine("*  {0}", new object[]
				{
					metadataDeclaration.ToString()
				});
			}
		}
	}
	CoreMessageSource.Instance.Write(_0.Assembly.GetSystemAssembly(), SeverityType.Error, "PS0243", new object[]
	{
		flag ? 10 : 50,
		flag ? "project" : "solution"
	});
	return false;
}

当大于10或者大于50的时候,就直接返回的false。看来我们已经找到了症结所在,那就直接让这个方法返回true吧,取消任何限制。
但这这又引出来了另一个问题,dnSpy现在反编译的方法名里有特殊符号^,直接右键[编辑这个类]之后没法编译回去。

这就要求我们能直接修改IL代码,右键点击[编辑IL指令],
在这里插入图片描述
把“指令”和“局部变量”选项卡里所有的操作码和变量都清除掉,然后把下图里的操作码都添加到指令里:
在这里插入图片描述
然后局部变量按如下改:
在这里插入图片描述
改完之后方法就变成了这样,直接return true 是不是很爽?
在这里插入图片描述
然后“保存模块”即可。

注意
因为我项目的nuget里只用到了4.3.333版本的postsharp,所以我只改了这个版本的。如果你用到了其他版本的postsharp对应着改就行了。

最后,将我们修改好的dll覆盖掉所有和4.3.33版本有关的dll就OK了,如图将下面的两个dll都替换掉:
在这里插入图片描述

结束

以后PostSharp安装卸载、切换不同版本就这么搞就行了。
附修改后4.3.33版本的dll,链接: https://pan.baidu.com/s/1Z-fSfeB-oMPsoMIX9WwOww 提取码: jyp3

展开阅读全文

没有更多推荐了,返回首页