生成.dll的初始化代码

本文关键字:代码 初始化 dll 生成 | 更新日期: 2023-09-27 18:18:38

我最近听说。dll可以在加载时立即运行代码,例如,当引用。dll的应用程序加载时。事件虽然我做了一些我自己的测试,并试图在这里和谷歌上寻找答案,我无法找到一些方法来生成。dll的初始化方法。

我想知道它是否真的有可能运行代码从一个。dll时,它是由一个应用程序加载。

如果有,我该怎么做?

生成.dll的初始化代码

警告(感谢Ben Voigt for the catch:)):下面的代码只适用于 c# ,保证生成的类不会是beforefieldinit。但是对于, c++/CLI不应该那么容易工作:管理的c++静态构造函数没有在。net中调用


正如我在评论中所说的,你可以这样写:

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方法,并要求所有用户在使用库之前调用它,甚至验证并获得他们每次使用时使用的安全令牌…

编辑:

无论你使用什么保护,一个有决心的攻击者都可以通过反编译库来绕过所有的管道,所以如果可以的话,你应该对混淆你的库,以(一点)更受保护。

To long for comment…

请注意,将不重要的代码(如缓慢的远程网络调用)放入任何类型的启动代码(如重要类的静态构造函数)都会疏远库的用户。它可能会迫使他们编写特殊的代码来避免加载/方法调用时的随机延迟。

在库中简单地使用"validate license"方法可能是更好的解决方案。

请注意,"电话回家"功能本身通常不太受用户欢迎,最好有良好的文档记录。特别是如果您希望您的库可以作为其他程序的一部分使用。

可以在应用程序构造函数中调用dll代码。