The reason this worked in VB, and not in C#, had nothing to do with assemblies.
The default constructor for WebControl is protected.
VB and C# have different interpretations of what "protected" means.
In VB, you can access a protected member of a class from any method in any type that derives from the class.
That is, VB allows this code to compile:
class Base
protected m_x as integer
end class
class Derived1
inherits Base
public sub Foo(other as Base)
other.m_x = 2
end sub
end class
class Derived2
inherits Base
end class
Because a "Derived1" is a base, it can access protected members of "other", which is also a base.
C# takes a different point of view. It doesn't allow the "sideways" access that VB does.
It says that access to protected members can be made via "this" or any object of the same type as the class that contains the method.
Because "Foo" here is defined in "Derived1", C# will only allows "Foo" to access "Base" members from a "Derived1" instance. It's possible for "other" to be something that is not a "Derived1" (it could, for example, be a "Derived2"), and so it does not allow access to "m_x".
In this case of your code, VB allowed "sideways" access to the "WebControl" constructor.
C#, however, did not.