我最近听说.dll一旦加载就可以运行代码,例如,当加载引用.dll的应用程序时。事件虽然我做了一些我自己的测试,并试图在这里寻找答案,在谷歌我无法找到一些方法来生成.dll的初始化方法。
我想知道在应用程序加载代码时是否真的可以从.dll运行代码。
如果是这样,我该怎么办?
答案 0 :(得分:8)
警告(感谢 Ben Voigt 以获取:)):以下代码仅适用于 C#,以确保生成的类不会在beforefieldinit之前即可。 但是 C ++ / CLI 不应该那么容易:Managed C++ Static Constructor not called in .net4
正如我在评论中所述,您可以使用以下内容:
using System;
class MyAwesomeLibrary
{
static MyAwesomeLibrary()
{
Console.WriteLine(string.Format("Hey {0} is using me!", Environment.UserName));
}
public static int GetTheAnswer()
{
return 42;
}
}
class Client
{
static void Main()
{
Console.WriteLine("The answer is: " + MyAwesomeLibrary.GetTheAnswer());
}
}
在静态构造函数中,您可以执行高级操作,例如检查注册表,与服务器通信......
如果你是一个坏人(或者只是想要保护其权利的开发者/公司),你可以抛出异常:
throw new Exception("The library has not been correctly registered...");
这将导致TypeInitializationException阻止使用整个库类。
或者您可以实现 CheckMe 方法,并要求所有用户在使用库之前调用它,甚至要进行身份验证并获取每次使用时都会使用的安全令牌......
编辑:
无论您使用何种保护措施,确定的攻击者都可以通过反编译库来规避所有管道,如果可以的话,您应该模糊您的库,以便(稍微)更多地受到保护。
答案 1 :(得分:2)
渴望评论......
请注意,将非平凡代码(即慢速远程网络调用)放入任何类型的启动代码(如重要类的静态构造函数)将疏远您的库的用户。它可能会强制它们编写特殊代码以避免加载/方法调用的随机延迟。
简单地在库中使用“验证许可证”方法可能是更好的解决方案。
请注意,“手机之家”功能本身通常不受用户欢迎,并且更好地记录在案。特别是如果您希望您的库可以作为其他程序的一部分使用。
答案 2 :(得分:-1)
您可以在应用程序构造函数中调用dll代码。 这是解决装配的点。