これが C# ではなく VB で機能した理由は、アセンブリとは何の関係もありませんでした。
WebControl の既定のコンストラクターは保護されています。
VB と C# では、「保護」の意味が異なります。
VB では、クラスから派生した任意の型の任意のメソッドから、クラスの保護されたメンバーにアクセスできます。
つまり、VB ではこのコードをコンパイルできます。
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
"Derived1" はベースであるため、ベースでもある "other" の保護されたメンバーにアクセスできます。
C# は別の視点を持っています。VB が行う「横向き」アクセスは許可されません。保護されたメンバーへのアクセスは、「this」またはメソッドを含むクラスと同じタイプのオブジェクトを介して行うことができると言われています。
ここでの "Foo" は "Derived1" で定義されているため、C# は "Foo" が "Derived1" インスタンスから "Base" メンバーにアクセスすることのみを許可します。"other" が "Derived1" ではない可能性があるため (たとえば、"Derived2" である可能性があります)、"m_x" へのアクセスは許可されません。
このコードの場合、VB は「WebControl」コンストラクターへの「横向き」アクセスを許可しました。
しかし、C# はそうではありませんでした。