c#如何更改构建文件以允许为继承类创建DLL?

c#如何更改构建文件以允许为继承类创建DLL?,c#,winforms,plugins,dll,csproj,C#,Winforms,Plugins,Dll,Csproj,我正在使用visual Studio 2013 Express构建一个winforms插件项目。这将是一个“工具箱”,通过将DLL复制到某个文件夹,可以在其中添加各种“工具”,在新的选项卡页上可以看到、加载和添加这些DLL。我决定为插件框架运行一个VS copy,并创建一个插件 我找到了如何从studio项目创建DLL的线索,第一次测试一切顺利。不错的工作流程。但是,当我将第一个工具更改为从自定义插件基类(继承自UserControl)而不是直接从UserControl下降时,我遇到了一个编译器

我正在使用visual Studio 2013 Express构建一个winforms插件项目。这将是一个“工具箱”,通过将DLL复制到某个文件夹,可以在其中添加各种“工具”,在新的选项卡页上可以看到、加载和添加这些DLL。我决定为插件框架运行一个VS copy,并创建一个插件

我找到了如何从studio项目创建DLL的线索,第一次测试一切顺利。不错的工作流程。但是,当我将第一个工具更改为从自定义插件基类(继承自UserControl)而不是直接从UserControl下降时,我遇到了一个编译器错误。(找不到类型或命名空间“Base…”

这是一个完全精简的版本,将得到相同的错误。显然,已编辑的.csproj文件中存在错误或缺失

  • 那么,应该如何更改构建文件以允许为继承的类创建DLL呢
  • 还有:有没有关于选项的解释,比如“Plugin”或“DependentUpon”或“SubType”
  • 顺便说一句:在真实版本中,我必须合并UserControl的部分类部分才能使其工作。(那是在移动到基类之前)我可以更改.csproj文件以允许部分类吗

    使用制度; //.. 命名空间测试\u cx1 { 阶级基础 { } }

    使用系统;
    //..
    命名空间测试\u cx1
    {
    类工具1:基本类
    {
    }
    }
    符合事实的
    符合事实的
    ..
    ..
    

问题在于,解决方案中在csproj中设置MSBuild的方式只会将标记为True的单个.cs文件编译成一个plugin.dll。因此,编译失败是因为基类未编译,这也是部分文件无法工作的原因

一个简单的解决方案是跳过csproj中所有真正的过滤内容,只需在BuildPlugins目标中为每个要编译的插件添加一行CSC,如下所示:

<CSC Sources="Base.cs;Tool1.cs" TargetType="library" OutputAssembly="$(OutputPath)Tool1.dll" EmitDebugInformation="true" />

在源代码中,列出插件所需的文件,并将输出路径修改为所需dll的任何名称


但是,在您的情况下,我可能会建议您将每个工具的项目添加到解决方案中。

通过“运行VS复制”,您的意思是您正在使用“工具箱”和“工具”的两个不同解决方案运行Visual Studio的两个实例吗?对。我还添加了一个构建后xcopy来将dll复制到另一个解决方案中。很有魅力,酷!这正是正确的妥协。至于每个工具建议的项目:我想我会为那些无关的、没有太多共享的工具这样做。不过,我遇到了两个新问题。一个是关于XCOPY复制旧版本,另一个是关于向上转换到基类以获得invalidcast错误。看和。好的,这是最后的答案:上面的建议很接近,但并不完全正确。如果我通过将基类添加到源代码中直接将其编译到DLL中,它将与尝试引用它的任何其他构建不同。所以我不能在消费程序中向上转换到基础。因此,必须将引用添加到csc行中,如下所示:
添加并添加到最终答案:由于难以理解的原因,构建文件也不尊重其他依赖项,尤其是部分类(如usercontrols)的连接;因此,我必须将“usercontrol.designer.cs”添加到源代码中。叹气(上述方法之所以有效,是因为我已经销毁了designer.cd并将其修补到cs文件中。(arghh…)所有这些问题都是我建议您使用单独项目的原因。:)是 啊好我已经准备好了大约一个dozem小工具,而且数量还会增加。在公共库中保留一些是可以的,但对于较大的库,我将使用单独的库。工具箱中的库管理器已就位,工作正常。但我真的想要所有的选择。顺便说一句:我仍然没有将resourcefile包含到构建中。一定有办法。。
<CSC Sources="Base.cs;Tool1.cs" TargetType="library" OutputAssembly="$(OutputPath)Tool1.dll" EmitDebugInformation="true" />