生成.dll的初始化代码

Bru*_*ein 10 c# c++-cli

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

我想知道是否真的可以在应用程序加载时从.dll运行代码.

如果是这样,我该怎么办?

Pra*_*eek 8

警告(感谢Ben Voigt的捕获:)):以下代码仅适用于C#,它保证生成的类不会在beforefieldinit之前.但是使用C++/CLI不应该那么容易:在.net4中没有调用托管C++静态构造函数


因此,如我的评论中所述,您可以使用以下内容:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

在静态构造函数中,您可以执行高级操作,例如检查注册表,与服务器通信......

如果你是一个坏人(或者只是想要保护其权利的开发者/公司),你可以抛出异常:

throw new Exception("The library has not been correctly registered...");
Run Code Online (Sandbox Code Playgroud)

这将导致TypeInitializationException阻止使用整个库类.

或者你可以实现一个CheckMe方法,并要求所有用户在使用库之前调用它,甚至要进行身份验证并获取他们每次使用时都会使用的安全令牌......

编辑:

无论您使用何种保护措施,确定的攻击者都可以通过反编译库来绕过所有管道,如果可以的话,您应该对您的库进行模糊处理(稍微)一点点保护.

  • 这不会妨碍整个库的使用.只需使用构造函数抛出异常的类型.您必须将代码放在每个公共类型的静态构造函数中才能执行此操作. (2认同)