// Class and namespace declaration
CodeCompileUnit targetUnit = new CodeCompileUnit();
CodeNamespace namespaceDeclaration = new CodeNamespace(NAMESPACE);
namespaceDeclaration.Imports.Add(new CodeNamespaceImport("System"));
namespaceDeclaration.Imports.Add(new CodeNamespaceImport("System.Runtime.InteropServices"));
namespaceDeclaration.Imports.Add(new CodeNamespaceImport("Microsoft.Win32"));
CodeTypeDeclaration targetClass =
new CodeTypeDeclaration(CLASSNAME)
{
IsClass = true,
TypeAttributes = TypeAttributes.Public,
IsPartial = true
};
namespaceDeclaration.Types.Add(targetClass);
targetUnit.Namespaces.Add(namespaceDeclaration);
CodeAttributeDeclaration classInterfaceAttribute =
new CodeAttributeDeclaration("System.Runtime.InteropServices.ClassInterfaceAttribute",
new CodeAttributeArgument(new CodePrimitiveExpression(ClassInterfaceType.AutoDual)));
CodeAttributeDeclaration comVisibleAttribute =
new CodeAttributeDeclaration("System.Runtime.InteropServices.ComVisibleAttribute",
new CodeAttributeArgument(new CodePrimitiveExpression(true)));
CodeAttributeDeclaration guidAttribute =
new CodeAttributeDeclaration("System.Runtime.InteropServices.GuidAttribute",
new CodeAttributeArgument(new CodePrimitiveExpression(Guid.NewGuid().ToString().ToUpper())));
CodeAttributeDeclaration progIdAttribute =
new CodeAttributeDeclaration("System.Runtime.InteropServices.ProgIdAttribute",
new CodeAttributeArgument(new CodePrimitiveExpression(PROGID)));
// public static void RegisterFunction(Type type)
CreateMethod("System.Void", "RegisterFunction", MemberAttributes.Public | MemberAttributes.Static)
.AddParameter("type", FieldDirection.In, "System.Type")
.AddCodeSnippet("Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type));")
.AddMemberToClass(targetClass);
// public static void UnregisterFunction(Type type)
CreateMethod("System.Void","UnregisterFunction", MemberAttributes.Public | MemberAttributes.Static)
.AddParameter("type", FieldDirection.In, "System.Type")
.AddCodeSnippet("Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type),false);")
.AddMemberToClass(targetClass);
// private static string GetSubKeyName(Type type)
CreateMethod("System.String", "GetSubKeyName", MemberAttributes.Public | MemberAttributes.Static)
.AddParameter("type", FieldDirection.In, "System.Type")
.AddCodeSnippet(""CLSID\{" + type.GUID.ToString().ToUpper() + "}\Programmable";")
.AddMemberToClass(targetClass);
// public void OnConnection(object Application, ext_ConnectMode ConnectMode, object AddInInst, ref Array custom)
CreateMethod("System.Void","OnConnection", MemberAttributes.Public)
.AddParameter("Application", FieldDirection.In, "System.Object")
.AddParameter("ConnectMode", FieldDirection.In, "Extensibility.ext_ConnectMode")
.AddParameter("AddInInst", FieldDirection.In, "System.Object")
.AddParameter("custom", FieldDirection.Ref, "System.Array")
.AddCodeSnippet("mainApplication = Application as Application;")
.AddMemberToClass(targetClass);
// public void OnDisconnection(ext_DisconnectMode RemoveMode, ref Array custom)
CreateMethod("System.Void", "OnDisconnection", MemberAttributes.Public)
.AddParameter("RemoveMode", FieldDirection.In, "Extensibility.ext_DisconnectMode")
.AddParameter("custom", FieldDirection.Ref, "System.Array")
.AddCodeSnippet("mainApplication = null;")
.AddMemberToClass(targetClass);
// public void OnAddInsUpdate(ref Array custom)
CreateMethod("System.Void", "OnAddInsUpdate", MemberAttributes.Public)
.AddParameter("custom", FieldDirection.Ref, "System.Array")
.AddMemberToClass(targetClass);
// public void OnStartupComplete(ref Array custom)
CreateMethod("System.Void", "OnStartupComplete", MemberAttributes.Public)
.AddParameter("custom", FieldDirection.Ref, "System.Array")
.AddMemberToClass(targetClass);
// public void OnBeginShutdown(ref Array custom)
CreateMethod("System.Void", "OnBeginShutdown", MemberAttributes.Public)
.AddParameter("custom", FieldDirection.Ref, "System.Array")
.AddMemberToClass(targetClass);
}
public CodeMemberMethod CreateMethod(string returnType,string name, MemberAttributes attributes)
{
CodeMemberMethod method =
new CodeMemberMethod
{
Attributes = attributes,
Name = name,
ReturnType = new CodeTypeReference(returnType)
};
return method;
}
}
public static class CodeDomExtensions
{
public static CodeMemberMethod AddParameter(this CodeMemberMethod method, string name, FieldDirection direction, string parameterType)
{
method.Parameters.Add(
new CodeParameterDeclarationExpression { Name = name, Direction = direction, Type = new CodeTypeReference(parameterType) });
return method;
}
public static CodeMemberMethod AddCodeSnippet(this CodeMemberMethod method, string code)
{
method.Statements.Add(new CodeSnippetStatement(code));
return method;
}
public static CodeMemberMethod AddMemberToClass(this CodeMemberMethod method, CodeTypeDeclaration addMemberToClass)
{
if (!addMemberToClass.Members.Contains(method))
{
addMemberToClass.Members.Add(method);
}
return method;
}
}