我正在将betfair api从SOAP重写为json,我已经开始使用以前的方法,将其作为控制台应用程序,然后从任务调度器或win服务调用。
但是现在我被要求用代码做各种不同的工作,我不想为每个工作写一个控制台应用程序(不同的站点需要价格,下注等)
新的代码库比旧的代码库大得多,我可以将旧系统中的4个文件复制到一个dll应用程序中,然后创建各种控制台应用程序/服务来实现dll,但是因为它有40多个文件,如果可能的话,我不需要复制粘贴作业。
有没有一种方法可以用VS中的工具或命令轻松地将现有控制台项目转换为类/dll项目?
我希望能够创建简单的应用程序
1 2
| BetfairBOT myBOT = new BetfairBOT ()
myBOT .RunGetPrices(); |
或
1 2
| BetfairBOT myBOT = new BetfairBOT ()
myBOT .RunPlaceBets(); |
例如,2/3行代码来实现注册到我的应用程序的DLL。
所以如果没有复制粘贴,我能做到这一点。
我使用的是vs 2012,.net 4.5(或4.0,如果需要的话,取决于服务器),Windows 8.1
任何帮助都将不胜感激。
- 在解决方案资源管理器中选择项目…右键单击并选择属性…选择应用程序选项卡…。输出类型下拉列表中列出了什么?是否已启用?
- 您好,这里列出了控制台应用程序。还有Windows应用程序和类库。如果我把它改成类库就可以了。那么我只需要删除带有main(string[]args)等的程序类,当编译为exe时,它将是一个dll?
- 不确定VS2012会做什么…退后一点,试试看……afaik它只更改输出类型定义(以guid的形式存储在.csproj xml文件中)和一些模板基础…作为类库,它应该编译成一个dll。不是exe?
- 哈哈,对不起。只用于Windows应用程序和控制台应用程序。如果这不起作用,那么创建一个新项目,然后手工一个接一个地复制类的唯一方法,还是有一种自动化的方法?工具等
- 我认为您可以更改输出类型,但即使不能,如果您的控制台应用程序是用内部业务类编写的,您也可以在解决方案资源管理器中拖放文件并修复名称空间。
- 您可以引用来自其他项目的exe,就像引用dll一样。不管怎样,你想要的不是exe而是dll?
- 无论是clr还是c编译器,实际上都不关心原始项目是一个控制台模式的应用程序。或其文件扩展名。您可以简单地在另一个项目中添加对exe的引用。您可能需要声明一些类是公共的。
答案就在这里。虽然它使用WinForms而不是控制台应用程序,但我认为您可以使用它。
创建dll的步骤
步骤1:-文件->新建->项目->Visual C项目->类库。选择项目名称和适当的目录,单击"确定"。
单击"确定"按钮后,解决方案资源管理器将添加一个C类"class1.cs"。在这个类中,我们可以编写代码。
当我们双击class1.cs时,我们看到一个名称空间创建dll。我们将在项目中使用这个名称空间来访问类库。
步骤2:-在class1.cs中,我们创建了一个名为"sum"的方法,它接受两个整数值,并将sum返回给witch方法传递的数字。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| using System;
namespace CreatingDLL
{
public class Class1
{
/// <summary>
/// sum is method that take two integer value and return that sum
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public int sum(int x, int y)
{
return x + y;
}
}
} |
步骤3:-现在构建应用程序并查看项目的bindebug目录。已创建"creatingdll.dll"。
现在我们创建另一个应用程序,并使用此dll(creatingdll.dll)引用访问dll的方法。访问创建的dll的步骤
步骤4:-文件->新建->项目->Visual C项目->Windows窗体应用程序。
第5步:按下图设计窗户。
步骤6:-添加我们在几分钟前创建的dll(creatingdll)的引用。
添加dll引用后,将出现以下窗口。
步骤7:-在单击Windows窗体应用程序按钮时编写代码。在创建对象和添加dll的方法之前,在项目中添加命名空间createddll,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| using System;
using System.Windows.Forms;
using CreatingDLL;
namespace AccessingDLL
{
public partial class Form1 : Form
{
public Form1 ()
{
InitializeComponent ();
}
private void btnAdd_Click (object sender, EventArgs e )
{
Class1 c1 = new Class1 ();
try
{
txtResult .Text = Convert .ToString(c1 .sum(Convert .ToInt32(txtNumber1 .Text), Convert .ToInt32(txtNumber2 .Text)));
}
catch(Exception ex )
{
MessageBox .Show(ex .Message);
}
}
}
} |
步骤8:-现在构建应用程序并执行项目,然后查看输出。
编辑:要将应用程序更改为库,请执行以下步骤
首先,双击解决方案资源管理器窗口中的属性。
然后,在打开的页面上,将输出类型从控制台应用程序更改为类库。
- 嗨,斯科特,我明天有空的时候试试这个。不过看起来不错,所有的截图都很精彩。谢谢
- 顺便问一下,你从来没有告诉我,如果没有复制粘贴的工作,我怎么能把200多个类复制到这个新项目上?我真的不想亲手做。我能把整个项目复制到新的类项目中吗
- @Monkeymagix我编辑了我的答案,告诉你如何将应用程序更改为库。
- 因此,只要做一次更改,就会将所有文件(或重新分配)复制到新的应用程序-酷。谢谢
- @如果答案对您有用,请单击答案旁边的复选标记。
- 别担心,我会的,我上星期因为腿肿和蜂窝组织炎躺在床上,所以没有机会这样做。现在就去试试。
- 嗨,似乎所有的工作在将代码转换为DLL,我做了一个新的控制台应用程序与DLL作为参考。但是,当我实现它并调用其中一个方法时,会得到一个与该dll项目中的db连接字符串相关的错误。行是私有字符串connectionString=configurationManager.connectionStrings["brainic"].toString(&zwnj;&8203;);错误是未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例。在c:…etfairbot2etfairbot.cs中的newbot.betfairbot..ctor()处:行31(连接字符串的行)
- 出错的代码是我试图从控制台应用程序使用的dll类的初始代码,例如public control(int systempk)this.betfairbot=new betfairbot();//连接字符串行this.helperlib=new helperlib();中的错误我在新的控制台应用程序中用来调用此代码的代码是static void main(string[]args)console.writeline("in main");//works control control=new control(3);//失败
- 我尝试在两个实例之间进行调试,在新dll类的console app init上有一个断点,它在private string connectionstring=configurationmanager.connectionstrings["defaultdatabase"]到&zwnj;&8203;string();的行失败,异常为空。对象未设置为引用。我想知道现在它在一个dll中,我是否应该将它移动到该类的class in it中,因为它现在位于外部。
- 当我将连接字符串移到dll中的另一个init下,并且刚从dll中的app.config获得字符串值时,似乎与configurationmanager对象有任何关系(是否需要将此项从app.config重命名为dll的其他项目?)但在这一行中,this.logFileName=system.configuration.configurationManager.appSettings["logfi&zwnj;&8203;le"].toString();它也出错了。所以,任何进入ConfigurationManager管理器的东西都可能出错——我需要添加这个作为对控制台应用程序的引用吗?就像我对DLL应用程序所做的那样?或者别的什么>
- 我认为您的问题的解决方法是:stackoverflow.com/questions/5190539/&hellip;
- 嗨,谢谢你的提醒,所以我需要把所有关于连接字符串的app.config规则、到app存储文件夹的路径等移动到我的消费者应用程序。然后将它们作为参数传递到DLL中?这可能是一个需要重新编写的工作,因为我有一个静态助手类,它为记录的位置获取参数,是否记录等等,这在我的新DLL应用程序中的大多数类中都是init。不想让他们通过很多。可能需要重新安装
- 这是否意味着我需要从我的dll类项目中删除app.config文件?
- 不,您不需要将它们作为参数传递到DLL中。该链接上的其他答案有很好的解决方案:一些人说您可以使用:configurationsettings.appsettings["myclasses.connectionstrin&zwnj;&误8203;g"];一些人说XML文件最适合app.config。有人说你可以使用部署。我自己更喜欢XML文件。
- 好吧,你的说法是,我只是创建一个XML文件(任何特殊格式?),而不是重新编写所有的DLL代码。然后用一个xml getnode类型函数访问我的所有配置变量。当它说configurationsettings.appsettings["myclasses.connectionstrin&zwnj;&误8203;g"]时,我应该为myclasses输入什么?我的动态链接库的名称?或者别的什么?
- 顺便说一句,我绝对不是一个.NET专家,如果我的一些问题看起来很新,我会很抱歉的。
- 嗯,我不是配置方面的专家。我认为最好在stackoverflow中提出新问题,让其他人来回答。
- 我的函数有问题,他们告诉我使用的是一个XML文件,它是以末尾带有.config的dll命名的,例如string execonfigpath=this.gettype().assembly.location;我在try/catch中没有得到任何错误,因此configurationmanager.openexeconfiguration(execonfigpath);行起作用,但我返回的所有内容m getappsetting(configuration conf,string key)函数是string.empty。我尝试将.config添加到路径中,但这一点都没有帮助。有什么原因吗?