我找不到任何可以解释这一点的东西——出于某种原因,我的 .NET Core 2.0 ASP.NET 应用程序没有通过以下方式作为 DLL 运行:
dotnet MyProject.Web.dll
相反,我得到了例外:
未处理的异常:System.MissingMethodException:在程序集“MyProject.Web,版本=1.0.0.0,Culture=neutral,PublicKeyToken=null”中找不到入口点。
namespace MyProject.Web
{
public class Program
{
public static void Main(string[] args)
{
LoadDependencies();
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
private static void LoadDependencies()
{
DependencyLocator.Instance.DefineIfUndefined<IDataProvider, DataProvider>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
它作为独立的可执行文件运行良好(当在项目配置中定位“控制台应用程序”时),但现在我正在尝试部署到需要它通过 dotnet 命令运行的服务器(作为 DLL,即“dotnet .\MyProject.Web.dll"),它似乎有问题。我在我的服务器和我的本地开发框上都收到了上述异常。
我有点惊讶它找不到 Main 方法——它在 Program.cs 中被声明为静态方法。我错过了什么吗?
(编辑:为了澄清,我试图针对“dotnet”命令运行的 DLL 来自编译为“控制台库”的目标,因为我的服务器明确要求 DLL,因为它们不会运行可执行文件)。
由于某种原因,我现在遇到了CreateInstanceAndUnwrap的问题(之前正在工作).
我的过程是这样的:
我动态生成一些代码,它通过MEF从子目录加载DLL.然后,这些应用程序从这些DLL加载不同的部分(按需).我不得不更新我的代码,现在包含一个包含调用程序集路径的AppDomainSetup.
我正确地创建了新的AppDomain - 没有问题.当我尝试运行此代码时:
object runtime = domain.CreateInstanceAndUnwrap(
typeof(CrossDomainApplication).Assembly.FullName,
typeof(CrossDomainApplication).FullName);
Run Code Online (Sandbox Code Playgroud)
我遇到了大量问题 - 运行时(上面的变量)不再可以转换为CrossDomainApplication或ICrossDomainApplication.
实际对象如下:
public class CrossDomainApplication : MarshalByRefObject, ICrossDomainApplication
Run Code Online (Sandbox Code Playgroud)
接口看起来像:
public interface ICrossDomainApplication
{
void Run(CrossDomainApplicationParameters parameters);
}
Run Code Online (Sandbox Code Playgroud)
参数看起来像:
[Serializable]
public class CrossDomainApplicationParameters : MarshalByRefObject
{
public object FactoryType { get; set; }
public Type ApplicationType { get; set; }
public string ModuleName { get; set; }
public object[] Parameters { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
本机类型的运行时似乎是MarshalByRefObject - 它不喜欢转换为其他任何东西.
什么可能出错?
编辑:这是我运行时出现的错误,如下所示:
ICrossDomainApplication runtime = (ICrossDomainApplication)domain.CreateInstanceAndUnwrap(
typeof(CrossDomainApplication).Assembly.FullName,
typeof(CrossDomainApplication).FullName);
//Exception …Run Code Online (Sandbox Code Playgroud)