Tôi đã đọc nhiều phiên bản khác nhau của câu hỏi này như trên Stack Overflow, cũng như mọi liên kết màu xanh trên trang đầu của 3 tìm kiếm khác nhau của Google cho hướng dẫn, cũng như MSDN (là loại nông cạn ngoài việc thực hiện các hội đồng). Tôi chỉ có thể nghĩ đến những nỗ lực của mình để giúp Tao làm việc như một trường hợp thử nghiệm tốt, nhưng hãy tin tôi, tôi đã thử với một chuỗi trả về đơn giản, một đôi, một hàm với các thông số. Dù vấn đề của tôi là gì, nó không phải là Tao.C# Dynamic Loading/Unloading DLLs Redux (sử dụng AppDomain, tất nhiên)
Về cơ bản tôi muốn tạo một lớp testLibraryDomain.CreateInstance()
của lớp Vẽ trong không gian tên GLPlugin.
if(usePlugin)
{
AppDomain testLibraryDomain = AppDomain.CreateDomain("TestGLDomain2");
//What the heck goes here so that I can simply call
//the default constructor and maybe a function or two?
AppDomain.Unload(testLibraryDomain);
}
Gl.glBegin(Gl.GL_TRIANGLES);
Tôi biết một thực tế rằng:
namespace GLPlugin
{
public class DrawingControl : MarshalByRefObject
{
public DrawingControl()
{
Gl.glColor3f(1.0f , 0.0f , 0.0f);
//this is a test to make sure it passes
//to the GL Rendering context... success
}
}
}
thực sự làm thay đổi màu bút. Nó hoạt động khi tôi cung cấp cho nó một điểm nhập static void Main(string args[])
và tôi gọi testLibraryDomain.ExecuteAssembly(thePluginFilePath)
Có hay không một ExecuteAssembly trực tiếp sẽ làm việc có liên quan đến tôi, vì tôi đã không chắc chắn các cuộc gọi GL sẽ làm cho nó vào "cấp cao nhất" AppDomain của OpenGL bối cảnh. Nó thậm chí còn cho phép tôi ghi đè lên hội đồng và thay đổi Màu Bút lần thứ hai. Thật không may cho nó một điểm nhập thực thi có nghĩa là một giao diện điều khiển popup ngắt tôi sau đó biến mất. Nó cũng hoạt động khi tôi chỉ cần cung cấp cho nó một tham chiếu trong dự án và tạo ra một thường lệ GLPlugin.DrawingTool tool = new GLPlugin.DrawingControl()
, hoặc thậm chí tạo ra một someAssembly = Assembly.LoadFrom(thePluginFilePath)
(mà tất nhiên và không may, khóa lắp ráp, ngăn chặn thay thế/biên dịch lại).
Khi sử dụng bất kỳ phương pháp nào khác nhau mà tôi đã thử, tôi luôn nhận được "tên lắp ráp đã cho hoặc mã cơ sở của nó không hợp lệ". Tôi hứa, nó hợp lệ. Một cái gì đó trong cách tôi đang cố gắng để tải nó không phải là.
Một điều tôi biết tôi đang thiếu là một thiết lập chính xác cho các testLibraryDomain.CreateInstance(string assemblyName , string typeName);
Theo như tôi có thể nói, lập luận AssemblyName không phải là filepath vào file lắp ráp. Là không gian tên, hoặc thậm chí chỉ là tên lắp ráp, ví dụ: GLPlugin
? Nếu vậy, tôi sẽ tham khảo tệp thực sự ở đâu? Không có một sốAppDomain.LoadFrom (someFilename), mặc dù nó sẽ là tiện dụng nếu có. Ngoài ra, những gì heck là Type, và string typeName tại đó? Tôi không muốn để trong "Object"
ở đây làm tôi, vì không phải là tạo ra loại khác hơn là một thể hiện của một đối tượng? Tôi cũng đã thử CreateInstanceAndUnwrap(... , ...)
với sự thiếu hiểu biết cơ bản về AppDomain. Thông thường tôi có thể lộn xộn thông qua hướng dẫn và nhận được những thứ để làm việc, mặc dù tôi thường không hiểu "Tại sao?" ... không phải như vậy ở đây. Thông thường nó rất hữu ích cho tôi để tìm kiếm sáu hướng dẫn khác nhau ... không phải như vậy ở đây một lần nữa, nhưng bởi vì mỗi người có một cách tiếp cận cơ bản (hoặc những gì dường như được như vậy).
Vì vậy, xin vui lòng ELI5 ... Tôi muốn tải một thể hiện của một lớp từ một dll trong một AppDomain riêng biệt, có thể chạy một vài chức năng, và dỡ bỏ nó. Cuối cùng tạo ra một danh sách các chức năng như Danh sách, loại bỏ/cập nhật khi cần thiết ... Tôi muốn có thể vượt qua đối số cho họ là tốt, nhưng đó sẽ là bước 2. Theo StackOverflow, tôi phải tìm hiểu về serializable
mà tôi sẽ cất cánh trong một ngày khác. (Tôi tưởng tượng bạn sẽ có thể hình dung từ ví dụ của tôi những gì tôi đang cố gắng làm.)
Để tải các cụm không cần khóa Tôi nghĩ tốt hơn là nên sử dụng Sao chép bóng, hãy xem http://msdn.microsoft.com/en-us/library/ms404279.aspx. – Maarten
Tôi tò mò về ví dụ của bạn, một lần nữa có thể là do thiếu kiến thức cơ bản ... ở đâu "áp dụng" mới 'loadAssembly' vào' apd' AppDomain thay vì cấp cao nhất mặc định? Nó chỉ được ngụ ý theo thứ tự, như trong bạn đã tạo ra một AppDomain, sau đó tất cả mọi thứ bên dưới nó là một phần của nó cho đến khi 'Unload()'? Ngoài ra, bài viết tuyệt vời, một chút trên đầu tôi mặc dù. Tôi đọc một phần của nó đã được tách ra và đưa vào một trang web quảng cáo nhưng nó là tốt đẹp để có toàn bộ bài viết. Tôi sẽ cố gắng thực sự học hỏi từ nó thông qua quá trình của ngày hôm nay. Loại mong muốn nó có một tập tin nguồn chức năng. – Adam
Tôi không chắc chắn nếu tôi hiểu câu hỏi của bạn, nhưng tôi sẽ cố gắng để chơi xung quanh với một số ví dụ và ý kiến từ ứng dụng cũ của tôi sau ngày hôm nay. –