2009-09-01 31 views
6

Tôi đã cố gắng rõ ràng:Làm thế nào để lưu trữ một công cụ IronPython trong một AppDomain riêng biệt?

var appDomain = AppDomain.CreateDomain("New Domain"); 
var engine = IronPython.Hosting.Python.CreateEngine(appDomain); // boom! 

Nhưng tôi nhận được thông báo lỗi sau: Loại không được giải quyết cho thành viên 'Microsoft.Scripting.Hosting.ScriptRuntimeSetup, Microsoft.Scripting, Version = 0.9.0.0, Văn hóa = trung lập, PublicKeyToken = 31bf3856ad364e35 '.

Googling cho lỗi này vẫn chưa được chứng minh hiệu quả sofar ...

EDIT # 1:

tôi đã cố gắng để tạo ra một dự án tái tạo tối thiểu bằng cách sao chép những thứ có liên quan đến một ứng dụng điều khiển mới:

using System; 
using Microsoft.Scripting; 

namespace PythonHostSamle 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AppDomain sandbox = AppDomain.CreateDomain("sandbox"); 
      var engine = IronPython.Hosting.Python.CreateEngine(sandbox); 
      var searchPaths = engine.GetSearchPaths(); 
      searchPaths.Add(@"C:\Python25\Lib"); 
      searchPaths.Add(@"C:\RevitPythonShell"); 
      engine.SetSearchPaths(searchPaths); 
      var scope = engine.CreateScope(); 
      //scope.SetVariable("revit", _application); 
      //engine.Runtime.IO.SetOutput(new ScriptOutputStream(_instance),  Encoding.UTF8); 
      //engine.Runtime.IO.SetErrorOutput(new ScriptOutputStream(_instance),  Encoding.UTF8); 
      var script = engine.CreateScriptSourceFromString("print 'hello, world!'",  SourceCodeKind.Statements); 
      script.Execute(scope); 

      Console.ReadKey(); 
     } 
    } 
} 

Điều này hoạt động như mong đợi! Vì vậy, tôi bị kết luận rằng lỗi tôi nhận được liên quan đến một trong các dòng tôi đã nhận xét: Phạm vi được thêm vào công cụ chứa đối tượng tôi có ít quyền kiểm soát hơn - tham chiếu đến máy chủ lưu trữ plugin phần mềm này được thiết kế để chạy trong (Autodesk Revit Architecture 2010).

Có thể cố gắng vượt qua đó là điều gì đang tạo ra lỗi?

Có cách nào để vượt qua proxy không? (Sẽ phải nhìn lên NET khiển từ xa ...)

EDIT # 2:

tôi đã đẽo vấn đề xuống để đi qua một đối tượng thông qua phạm vi mà không thể ủy quyền cho AppDomain khác: Tất cả các đối tượng được thêm vào phạm vi của trình thông dịch IronPython chạy trong một AppDomain khác sẽ phải được sắp xếp theo cách nào đó và do đó phải mở rộng MarshalByRefObject hoặc là Serializable.

+0

Bạn có thể cung cấp thêm thông tin về cách bạn đang biên soạn/chạy ứng dụng này không? Điều này có tác dụng đối với tôi so với 2.0.2 và 2.6 Beta 2 khi tôi đặt "test.cs" trong thư mục Program Files và chạy nó. Bạn cũng đang chạy với .NET 2.0/3.0/3.5 hoặc .NET 4? –

+0

tôi sẽ đề xuất, rằng đó là các luồng mà bạn tạo trong miền ứng dụng này, nhưng hãy để máy chạy trong miền ứng dụng khác ... – cRichter

Trả lời

2

Chỉ cần tạo lớp bootstrapping của riêng bạn sẽ chạy trong một AppDomain mới và sẽ thực hiện khởi tạo IronPyton ở đó, nó sẽ giải quyết câu hỏi?

+0

Tôi đã có thể giảm sự cố cho một thứ khác - các đối tượng tôi muốn chuyển vào thời gian chạy IronPython không phải là MarshalByRef và đó là vấn đề ... –

Các vấn đề liên quan