Tag: plugins

将DLL加载到具有已知唯一公共接口的单独AppDomain中

我需要在另一个域中加载.dll(插件)。 在主应用程序中,我对插件类型一无所知,只是他们用一些方法实现了通用接口ICommonInterface。 因此,这段代码无济于事,因为我无法创建具有接口类型的实例。 AppDomain domain = AppDomain.CreateDomain(“New domain name”); //Do other things to the domain like set the security policy string pathToDll = @”C:\myDll.dll”; //Full path to dll you want to load Type t = typeof(TypeIWantToLoad); TypeIWantToLoad myObject = (TypeIWantToLoad)domain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName); 我的问题是我如何在新域中加载程序集并获取实例,如果我只知道实现我想要创建的类型的接口名称。 更新:这是我的代码:MainLib.dll namespace MainLib { public interface ICommonInterface { void ShowDllName(); } } PluginWithOutException.dll […]

Notepad ++插件 – 查找并突出显示文本

如何通过在c#中编写notepad ++插件来设置和删除scintilla文档中查找文本的颜色。 我尝试了以下代码: Win32.SendMessage(PluginBase.GetCurrentScintilla(), SciMsg.SCI_STYLESETBACK, 0, 0xFFFF00); 帮我突出显示一个特定的文字。

AppDomain.CurrentDomain.AssemblyResolve in dynamics crm

因此,我参考了许多引用AppDomain.CurrentDomain.AssemblyResolve文章,以便在运行时将嵌入式资源中的DLL加载到插件中(不使用IlMerge)。 但是,当我插入此代码时,事件处理程序永远不会在插件为我的主库抛出TypeLoadException消息之前接收该线程。 我已经尝试将代码放在静态构造函数中,在Execute方法内部和主构造函数中; 虽然事件处理程序已注册,但处理程序中的断点不会被命中。 环境是Dynamics CRM 2011,最新汇总并使用SDK开发人员工具插件项目和插件类生成。 任何人都知道我需要做些什么才能让它发挥作用?

使用DXCore控制台应用程序获取解决方案/项目中的文件列表

据我所知,在插件中使用时,可以使用以下代码段提取VS解决方案信息。 EnvDTE.Solution solution = CodeRush.ApplicationObject.Solution; EnvDTE.Projects projects = solution.Projects; 问:我想构建一个控制台应用程序并访问这些文件详细信息。 我的目标是创建一个控制台应用程序(可以在没有VS的情况下运行),根据我在输入.sln文件中找到的设计问题生成报告。 我可以使用哪些function?

版本之间的界面变化 – 如何管理?

这是我们在客户网站上遇到的一种相当不愉快的泡菜。 客户端有大约100个工作站,我们在其上部署了产品“MyApp”的1.0.0版本。 现在,该产品所做的一件事就是它加载了一个加载项(称之为“MyPlugIn”,它首先在中央服务器上查找是否有更新的版本,如果是,则复制该文件在本地,然后它使用Assembly.Load加载加载项并调用某个已知的接口。这已经好几个月了。 然后客户想在某些机器上安装我们产品的v1.0.1(但不是全部)。 随之而来的是MyPlugIn的新版本。 但后来出现了问题。 有一个共享的DLL,由MyApp和MyPlugIn引用,称为MyDLL,它有一个方法MyClass.MyMethod 。 在v1.0.0和v1.0.1之间, MyClass.MyMethod的签名发生了变化(添加了一个参数)。 现在新版本的MyPlugIn会导致v1.0.0客户端应用程序崩溃: 找不到方法:MyClass.MyMethod(System.String) 客户端明确地不希望在所有客户端站点上部署v1.0.1,因为v1.0.1中包含的修复程序仅对少数工作站是必需的,并且不需要将其推广到所有客户端。 遗憾的是,我们还没有(还)使用ClickOnce或其他大规模部署实用程序,因此推出v1.0.1将是一项痛苦且不必要的练习。 有没有办法在MyPlugin中编写代码,以便它能够同样正常工作,无论它是处理MyDLL v1.0.0还是v1.0.1? 也许在实际调用它之前,有一些方法可以使用reflection来探测预期的接口,看它是否存在? 编辑:我还应该提一下 – 我们有一些非常严格的QA程序。 由于QA已正式发布v1.0.1,因此我们不允许对MyApp或MyDLL进行任何更改。 我们唯一的行动自由是改变MyPlugin,这是专门为这个客户编写的自定义代码。

加载程序集时依赖于另一个域的FileNotFound

我正在尝试使用插件进行应用程序。 我有MainLib.dll,我用1方法制作了一些commnon接口(让它是ICommon )。 然后,我制作了2个.dll(插件),它们引用了MainLib.dll并在某些类中实现了ICommon 。 此外,我删除了此.dlls exept System所有引用。 然后,我创建了一个应用程序,它监视文件夹”.\\Plugins”并加载newDomain所有.dll,检查.dll中的类型是否实现了ICommon (因此该应用程序也引用了MainLib.dll)。 如果是 – 在某些列表中添加.dll的名称。 现在问题出现了 :在我尝试加载插件之前 – 我将MailLib.dll和System加载到newDomain,因为所有插件都依赖于这个.dll。 他们加载正确。 然后,我开始加载插件,在这里我有: FileNotFoundException,无法加载文件或程序集’PluginWithException,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null’或其依赖项之一。 系统找不到指定的文件。)字符串上的程序集loadedAssembly = domain.Load(Assembly.LoadFrom(asm).FullName); PluginWithException程序集只有2个依赖项–System和MainLib。 在我尝试加载PluginWithException之前,我检查了新域中的程序集,System和MainLib已加载到此域。 所以我看不到任何依赖的问题。 我阅读了这个主题,并ProxyDomain使用ProxyDomain解决方案,但exception是相同的。 我做错了什么? 这里的代码: public static List SearchPlugins(string[] names) { AppDomain domain = AppDomain.CreateDomain(“tmpDomain”); domain.Load(Assembly.LoadFrom(@”.\MainLib.dll”).FullName); domain.Load(@”System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089″); MessageBox.Show(GetAssembies(domain)); // here I can […]

如何在应用程序运行时发现新的MEF部件?

我正在使用MEF在我的应用程序中加载插件。 一切正常,但我希望在将它们放入我的app文件夹时发现它们。 这可能吗? DirectoryCatalog有一个Changed事件,但我不确定它是如何工作的。 这是我现在的代码: public sealed class RevealerFactory { private static readonly Lazy lazy = new Lazy(() => new RevealerFactory()); public static RevealerFactory Instance { get { return lazy.Value; } } private FileSystemWatcher watcher; private RevealerFactory() { Initialize(); } [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] private IEnumerable<Lazy> Revealers { get; set; } public IRevealer GetRevealer(Uri uri) { […]

如何解决Dynamics CRM插件System.Security.Permissions.FileIOPermission错误

业务流程错误 System.Security.SecurityException:请求类型为’ System.Security.Permissions.FileIOPermission ,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089’的权限失败。 System.Security上的System.Security.CodeAccessSecurityEngine.Check(Object demand,StackCrawlMark和stackMark,Boolean isPermSet)处于System.IO.FileStream.Init的System.Security.CodeAccessPermission.Demand()处(字符串路径,FileMode模式,FileAccess访问,Int32权限,布尔值) System.IO.FileStream..ctor中的useRights,FileShare共享,Int32 bufferSize,FileOptions选项,SECURITY_ATTRIBUTES secAttrs,String msgPath,Boolean bFromProxy,Boolean useLongPath,Boolean checkHost)(字符串路径,FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize ,FileOptions选项,String msgPath,Boolean bFromProxy,Boolean useLongPath,Boolean checkHost)at System.IO.File.InternalWriteAllBytes(String path,Byte [] bytes,Boolean checkHost)at RetrieveAttachments.RetrieveClass.Execute(IServiceProvider serviceProvider)失败的操作是:需要失败的第一个权限的类型是:System.Security.Permissions.FileIOPermission失败的程序集区域是:MyComputer 我还在插件AssemblyInfo.cs文件[assembly:System.Security.AllowPartiallyTrustedCallers]中添加了以下方法,但它引发了同样的错误。 QueryExpression notes = new QueryExpression { EntityName = “annotation”, ColumnSet = new ColumnSet(“filename”, “subject”, “annotationid”, “documentbody”,”mimetype”) }; notes.Criteria.AddCondition(“annotationid”, ConditionOperator.Equal, annotationid); EntityCollection […]

列出从GAC实现特定接口的所有DLL

阿罗哈 给定一个插件架构(C#/ .NET 3.5),插件存储在GAC中,如何列出/加载包含实现我特定接口的类型的所有dll? 换句话说,我想通过查看GAC来调查我的应用程序的哪些插件安装在计算机上。 -Edoode

Mono.Addin实现不检索插件

我正在使用Mono.Addins框架,C#和visual studio 2010编写一个可扩展的应用程序。 我的申请结构如下: PROJECT1: namespace Plugins { [TypeExtensionPoint] public interface IPlugin { void Refresh(); string PlugInName { get; } void Initialize(InitParamsType parameters); } [TypeExtensionPoint] public interface IOrganizerPlugin : IPlugin { bool AllowsToEditBrandCode { get; } UserControl GetUI(); } public interface IPluginHost { void EmbedPlugin(PluginSpecalizedType plugin); } } 项目2(参考项目1): [assembly: AddinRoot(“App.Organizer”, “1.0”)] namespace App.Organizer { […]