9

I am compiling classes at run-time using the CodeDomProvider class. This works fine for classes only using the System namespace:

using System;

public class Test
{
    public String HelloWorld()
    {
        return "Hello World!";
    }
}

If I try to compile a class using System.Web.UI.WebControls though, I get this error:

{error CS0006: Metadata file 'System.Web.UI.WebControls' could not be found} System.CodeDom.Compiler.CompilerError

Here's a snippet of my code:

var cp = new CompilerParameters();

cp.ReferencedAssemblies.Add("System.Web.UI.WebControls");

How do I reference the System.Web.UI.WebControls namespace?

3 Answers 3

44

You can loop through all the currently loaded assemblies:

var assemblies = AppDomain.CurrentDomain
                            .GetAssemblies()
                            .Where(a => !a.IsDynamic)
                            .Select(a => a.Location);   

cp.ReferencedAssemblies.AddRange(assemblies.ToArray());
Sign up to request clarification or add additional context in comments.

3 Comments

Why catch try/catch when .Where(a => !a.IsDynamic ) would do it?
My original answer worked with .net 2.0 which is what I was using at the time I wrote the code. Neither LINQ nor the Assembly.IsDynamic property exist in .net 2.0.
Note that it's AddRange not Add (would fix but can't make <6 char edit).
16

You reference assemblies, not namespaces. You should use MSDN to look up the name of the assembly that contains the classes you need to use: in this case it's going to be:

var cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.Web.dll");

2 Comments

Doesn't work for me. Do you think I should supply the full path to the assembly? If yes; how might I do that dynamically?
Ah, System.Web.UI.WebControls.dll doesn't exist -- the classes in that namespace live in System.Web.dll instead.
6

This proved to be a little less brute force in my case. I was building an addin and there were 730 assemblies loaded in the current domain so there was major lag involved.

var assemblies = someType.Assembly.GetReferencedAssemblies().ToList();
   var assemblyLocations =  
assemblies.Select(a => 
     Assembly.ReflectionOnlyLoad(a.FullName).Location).ToList();

assemblyLocations.Add(someType.Assembly.Location);

cp.ReferencedAssemblies.AddRange(assemblyLocations.ToArray());

1 Comment

+1. I used your proposal and worked great. Just you need to edit the last line and write cp.ReferencedAssemblies.AddRange(assemblyLocations.ToArray()); instead.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.