我试图找到公开和使用.NET Framework 4创建的现有DLL的最佳和最快方法(作为Web服务)。我无权访问现有DLL的代码,并且DLL本身仅公开一个接口
通过将现有的DLL导入到我的包装Visual Studio项目中并获得对DLL接口的引用,我已成功做到了:
private MyCalculator initInterface()
{
string applicationBase = ConfigurationManager.AppSettings["DLL_LOCATION"];
var appDomain = CreateAppDomain(applicationBase);
string assemblyPath = Path.Combine(applicationBase, ConfigurationManager.AppSettings["DLL_NAME"]);
return (MyCalculator)appDomain.CreateInstanceFromAndUnwrap(assemblyPath, ConfigurationManager.AppSettings["DLL_INTERFACE"]);
}
private static AppDomain CreateAppDomain(string applicationBase)
{
var info = new AppDomainSetup { ApplicationBase = applicationBase };
var appDomain = AppDomain.CreateDomain("MyCalculator", null, info);
string configPath = Path.Combine(applicationBase, "MyCalculator.config");
appDomain.SetData("APP_CONFIG_FILE", configPath);
return appDomain;
}
当我在IIS上部署时,一切正常,但是我遇到了可怕的性能问题。 1)如果包装纸没有被打过一段时间,可能需要20到30秒的时间 2)预热后,仍然可能需要3-5秒才能得出结果。
注意:我已将“开始模式”配置为“始终运行”,并将“空闲超时”操作配置为“暂停”。
当我在没有IIS或任何其他开销的情况下原生调用DLL时,看到的响应时间约为0.25-〜0.5秒。
我在Google上搜索了很多,并且看到与包装非托管DLL相关的1000多个不同的线程,方法和建议。但是,有些非常旧,建议使用WCF,而较新的则建议使用MVC5。因此,需要一些有关如何最好地进行的建议。
如果有更简单的方法/更有效的方法,很高兴抛弃我已经创建的内容(例如包装器)。同样,如果在我创建的内容中有更好的实现方式,那也很好!
在此先感谢您的任何建议或指导!
其他注意事项/注释:
1)该解决方案仅需要公开此DLL的功能,并且将由其他服务器上的现有(非Windows)应用程序使用。 2)包装器/ DLL不会面向公众等,只会由上述现有应用程序调用。 3)使用IIS托管包装程序没有问题,但是很明显,这增加了不必要的开销(就IIS带来的所有其他事情和开销而言)