1

是否可以编写一个可以在同一个项目中创建/修改代码文件的控件 - (按照表单设计器的工作方式)。我看不到文件的实际创建/修改很麻烦 - 但是我想避免'xyz文件已被修改 - 你想重新加载它吗?对话。

老实说,我不指望我可以不写插件或类似的东西。

4

3 回答 3

0

Absolutley,看看 CodeDom:-

http://msdn.microsoft.com/en-us/library/y2k85ax6.aspx

或者考虑创建一个 Visual Studio 加载项:-

http://www.c-sharpcorner.com/UploadFile/mgold/AddIns11292005015631AM/AddIns.aspx

干杯,

菲尔。

于 2009-11-20T09:27:24.747 回答
0

这确实是可以做到的。参考后EnvDTE

using EnvDTE;


    var host = this.Container as IDesignerHost;
    var dte = host.GetService(typeof(DTE)) as DTE;
    var activeDoc = dte.ActiveDocument;
    var project = activeDoc.ProjectItem.Collection.Parent as Project;
    project.ProjectItems.AddFromFile("\\Test.cs");
于 2009-11-27T02:52:55.497 回答
0

正如 Plip 所说,使用 CodeDom,更具体地说 - CodeDocSerialier。这是一个简短的例子:

[Serializer(typeof(MySerializer))]
class MyControl : Control {}

class MySerializer : CodeDomSerializer
{
    public override object Serialize(IDesignerSerializationManager manager, object value)
    {
      CodeDomSerializer baseSerializer;
      CodeStatementCollection statements;
      CodeExpression targetObject;

      if(manager == null || value == null)
      {
        return null;
      }

      baseSerializer = (CodeDomSerializer)manager.GetSerializer(typeof(MyControl).BaseType, typeof(CodeDomSerializer));
      statements = baseSerializer.Serialize(manager, value) as CodeStatementCollection;
      if(statements == null)
      {
        statements = new CodeStatementCollection();
      }

      targetObject = GetExpression(manager, value);
      if(targetObject != null)
      {
        // add 'myControl.Visible = true;' statement.
        statements.Add(
          new CodeAssignStatement(
            new CodeFieldReferenceExpression(targetObject, "Visible"),
            new CodePrimitiveExpression(true)));
      }
      return statements;
    }
}
于 2009-11-29T19:07:23.730 回答