I have to agree with @Hans Passant (and here is some information about the frequently discussed DLL addon), but since you asked a question, I will try to answer it.
You can link a third-party DLL as a resource. Please see this question for details.
For other questions, I simply expose the appropriate classes from a third-party DLL in my own namespace, and perhaps use extension methods to provide any additional functions you want.
For example, you can grant access to the NLog Log() method using a static method in your class, say XyzNLog.Logger.Log() , taking care of initialization and anything internally, inside your code (static constructor or whatever something else that you like up). Since you download the NLog assembly using the method above, you will be the only one who has access to the built-in NLog assembly directly, and the user will not be able to access it. Now you are not taking advantage of the fact that all classes are automatically opened from NLog, but in this case you still have to set them manually.
EDIT . Another approach is to try using ILMerge with the / internalize flag as described here . You may not be able to completely solve the problem, but look in this article to find out if you can avoid the errors described by the author. Spoiler warning: this is not all peaches on this, but it can work with enough effort.
source share