diff --git a/Il2CppTests/Il2CppTests.csproj b/Il2CppTests/Il2CppTests.csproj
index a416127..b2a1cd0 100644
--- a/Il2CppTests/Il2CppTests.csproj
+++ b/Il2CppTests/Il2CppTests.csproj
@@ -31,15 +31,9 @@
-
-
-
-
-
-
@@ -58,17 +52,25 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
diff --git a/Il2CppTests/TestSources/CSharp1.cs b/Il2CppTests/TestSources/CSharp1.cs
new file mode 100644
index 0000000..61abc38
--- /dev/null
+++ b/Il2CppTests/TestSources/CSharp1.cs
@@ -0,0 +1,57 @@
+using System;
+
+/* C# 1.0 feature test */
+namespace Il2CppTests.TestSources
+{
+ public class SimpleClass : SimpleInterface
+ {
+ public SimpleStruct ss;
+ public int i;
+
+ public static SimpleStruct StaticFunc(SimpleStruct ss) {
+ Console.WriteLine(ss);
+ return new SimpleStruct();
+ }
+
+ public SimpleStruct InstanceFunc(SimpleStruct ss) {
+ Console.WriteLine(ss);
+ return this.ss;
+ }
+
+ public int func(int val) {
+ return val + 42;
+ }
+
+ public delegate SimpleStruct SimpleDelegate(SimpleStruct ss);
+ public event SimpleDelegate SimpleEvent;
+ public int SimpleProperty {
+ get { return 0; }
+ set { SimpleEvent(ss); }
+ }
+ }
+
+ public struct SimpleStruct : SimpleInterface
+ {
+ public SimpleClass sc;
+ public int i;
+
+ public static SimpleStruct StaticFunc(SimpleStruct ss) {
+ Console.WriteLine(ss);
+ return new SimpleStruct();
+ }
+
+ public SimpleClass InstanceFunc(SimpleStruct ss) {
+ Console.WriteLine(ss);
+ return this.sc;
+ }
+
+ public int func(int val) {
+ return ((SimpleInterface)sc).func(val) + 13;
+ }
+ }
+
+ public interface SimpleInterface
+ {
+ int func(int val);
+ }
+}
diff --git a/Il2CppTests/TestSources/CSharp2.cs b/Il2CppTests/TestSources/CSharp2.cs
new file mode 100644
index 0000000..5662844
--- /dev/null
+++ b/Il2CppTests/TestSources/CSharp2.cs
@@ -0,0 +1,100 @@
+using System;
+
+/* C# 2.0 feature test */
+namespace Il2CppTests.TestSources
+{
+ public interface GenericInterface
+ {
+ T func(T v);
+ T genericMethod(T v, T2 w);
+ }
+
+ public class GenericClass : GenericInterface
+ {
+ public T x;
+
+ public T func(T v) {
+ return v;
+ }
+
+ public T genericMethod(T v, T2 w) {
+ return x;
+ }
+
+ public static T myMethod(T x) {
+ return x;
+ }
+
+ public virtual bool returnBool() {
+ return true;
+ }
+ }
+
+ public class DerivedGenericClass : GenericClass, GenericInterface
+ {
+ public T2 t2;
+ public T2 func(T2 v) {
+ return t2;
+ }
+
+ public T2 genericMethod(T2 v, T3 w) {
+ return v;
+ }
+
+ public T2 newGenericMethod() {
+ return t2;
+ }
+
+ public static int Return42() {
+ return 42;
+ }
+ }
+
+ public struct GenericStruct : GenericInterface where T : struct
+ {
+ public T a;
+ public T func(T v) {
+ throw new NotImplementedException();
+ }
+
+ public T genericMethod(T v, T2 w) {
+ throw new NotImplementedException();
+ }
+
+ public T? genericMethod2(T x) {
+ return (new GenericClass()).returnBool() ? null : (T?)x;
+ }
+
+ public static GenericStruct ReturnStruct(T y) {
+ var res = new GenericStruct();
+ res.a = y;
+ return res;
+ }
+ }
+
+ public interface IVariance
+ {
+ T2 func(T1 v);
+ }
+
+ public class UseGenerics
+ {
+ public static void Main(string[] args) {
+ GenericStruct[] arr = new GenericStruct[3];
+ arr[0] = GenericStruct.ReturnStruct(3);
+ DerivedGenericClass gc = new DerivedGenericClass();
+ string c = gc.func("oops");
+ Console.WriteLine(c);
+ gc.genericMethod("hello", arr[0].genericMethod2(3) ?? 0);
+ GenericInterface s = gc;
+ s.genericMethod("goodbye", c);
+ GenericClass