我需要創建一個自定義應用程序域來解決.NET運行時的default behavior中的錯誤。我在網上看到的示例代碼都不是很有用,因爲我不知道在哪裏放置它,或者在我的Main()
方法中需要替換的代碼。如何創建應用程序域並在其中運行我的應用程序?
回答
什麼很具體的例子這也許應該指出的是,創造AppDomains只是爲了讓周圍的東西,可以固定一個常量字符串可能是錯誤的方式做到這一點。使用非靜態輔助O)
static void Main(string[] args)
{
if (AppDomain.CurrentDomain.IsDefaultAppDomain())
{
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
var currentAssembly = Assembly.GetExecutingAssembly();
var otherDomain = AppDomain.CreateDomain("other domain");
var ret = otherDomain.ExecuteAssemblyByName(currentAssembly.FullName, args);
Environment.ExitCode = ret;
return;
}
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
Console.WriteLine("Hello");
}
快速樣品:如果你正在嘗試做同樣的事情,正如你指出的鏈接,你可能只是這樣做:
var configFile = Assembly.GetExecutingAssembly().Location + ".config";
if (!File.Exists(configFile))
throw new Exception("do your worst!");
遞歸入口點入口點和MarshalByRefObject ...
class Program
{
static AppDomain otherDomain;
static void Main(string[] args)
{
otherDomain = AppDomain.CreateDomain("other domain");
var otherType = typeof(OtherProgram);
var obj = otherDomain.CreateInstanceAndUnwrap(
otherType.Assembly.FullName,
otherType.FullName) as OtherProgram;
args = new[] { "hello", "world" };
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
obj.Main(args);
}
}
public class OtherProgram : MarshalByRefObject
{
public void Main(string[] args)
{
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
foreach (var item in args)
Console.WriteLine(item);
}
}
您需要:
1)創建AppDomainSetup對象的實例,並通過使用AppDomain.CreateDoman方法你想要的設置信息,爲您的域名
2)創建新的域來填充它。具有配置參數的AppDomainSetup實例被傳遞給CreateDomain方法。
3)通過在域對象上使用CreateInstanceAndUnwrap方法在新域中創建對象的實例。這種方法需要你想創建的對象的類型名稱,並返回一個遠程代理,你可以在你的主域中使用它來與新的對象進行通信。
一旦你完成了這3個步驟,你可以調用方法通過代理的其他域。您也可以在完成後卸載域並重新加載。
這topic在MSDN幫助有需要
這或多或少是我在其他地方看到的例子,但不提供任何我仍然缺乏的信息。 我只是調用Application.Run(new MyForm)? 我是否從我的Main方法中刪除了所有現有的啓動代碼,將它放在一個新的方法中,然後調用它來啓動我的應用程序? 以上都不是,因爲我比我想象的更困惑? – 2010-04-15 20:03:46
您嘗試獲取代理的對象必須是'MarshalByRefObject',否則它只會嘗試將副本序列化回原始AppDomain。 – 2010-04-15 20:13:34
@Matthew Whited - 你是對的,我忘了提及 – mfeingold 2010-04-15 20:23:22
- 1. Log4net可以在新創建的應用程序域中運行
- 2. 如何從我的應用程序運行Facebook應用程序
- 3. 錯誤的應用程序域創建一個應用程序
- 4. 如何使用其他應用程序中的功能創建應用程序
- 5. 使應用程序運行在其他應用程序上方
- 6. 如何在我的應用程序中創建android應用程序
- 7. Facebook應用程序創建應用程序域錯誤
- 8. 如何在我的應用程序中創建應用程序內容的應用程序
- 9. 如何從iPhone中的其他應用程序運行一個應用程序?
- 10. 如何在iOS應用程序的背景上運行其他應用程序?
- 11. 如何創建iPad應用程序,重用我的JS應用程序構建的Web應用程序
- 12. 我將如何在android應用程序中創建此應用程序?
- 13. 如何爲應用程序node.js運行jenkins作業並創建反應應用程序
- 14. 如何在我的反應應用程序中運行彈出?
- 15. 如何在Sakai中運行由應用程序構建器創建的新JSF全原始應用程序
- 16. 如何在我的主域上使用Django應用程序,並在子域上使用PHP應用程序?
- 17. 如何運行使用yeoman創建的AngularJS應用程序
- 18. 讓我的應用程序只運行應用程序
- 19. 如果我的asp.net應用程序產生一個進程,該進程是否在asp.net應用程序運行的同一個應用程序域內運行?
- 20. 如何創建Fusion應用程序定製應用程序
- 21. 如何從SWT應用程序運行SWT應用程序?
- 22. 如何從Google Chrome應用程序運行Java應用程序?
- 23. .net - 未能創建應用程序域
- 24. 如何在eclipse上運行HTML5 ADT創建Android應用程序
- 25. 我如何在iphone編程中創建Cover Flow應用程序
- 26. 創建一個應用程序,通過點擊創建其他應用程序
- 27. 如何在我的Rails應用程序中管理其他heroku應用程序?
- 28. 如何在ios應用程序中宣傳我的其他iphone應用程序?
- 29. 在地鐵應用程序中創建WCF應用程序
- 30. 在設置應用程序中創建應用程序設置
謝謝。有沒有理由更喜歡一種方法對另一種? – 2010-04-15 20:18:42
第一個可能會更乾淨。它可以讓你使用標準的入口點,而不必創建一個需要在appdomains之間編組的對象。第二種方法更典型。但它通常用於插件,而不是應用程序的主要入口點。 – 2010-04-15 20:22:27
AppDomain對象上還有一個'.ExecuteAssembly(...)'方法,您可以提供包含入口點的另一個程序集的路徑。這可能允許稍微更簡潔的設計,但至少需要兩個組件。 – 2010-04-15 20:25:30