我与MEF合作,我正在寻找如何通过MEF找到插件的另一种方式更改插件位置的URL,我想更改此行
Assembly.LoadFrom(@"C:\julia\project\project.Plugin.Nav\bin\Debug\NavPlugin.dll")));
Run Code Online (Sandbox Code Playgroud)
我想删除此URL,因为我需要在另一台机器上部署我的应用程序
这是我的功能:
public void AssembleCalculatorComponents()
{
try
{
//var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
//var container = new CompositionContainer(catalog);
//container.ComposeParts(this);
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.LoadFrom(@"C:\yosra\project\project.Plugin.Nav\bin\Debug\NavPlugin.dll")));
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
catch (Exception ex)
{
throw ex;
}
}
Run Code Online (Sandbox Code Playgroud)
你能帮我么?
谢谢
我的问题始于将.Net 2.0应用程序移动到.Net 4.0.我必须这样做的原因是Windows 8默认情况下不启用早期的.Net版本,我的应用程序无法要求用户启用它.
该应用程序是一个NPAPI插件,它通过UnmanagedExports使用.Net组件.我将其设计为低完整性应用程序,因此它必须驻留在用户的LocalLow'目录中.
在我的应用程序中,我使用动态程序集加载机制在运行时加载多个程序集.我使用以下方法加载程序集,
MyInterface Instance;
Assembly assembly = Assembly.LoadFrom(AssemblyFile);
Type type = assembly.GetType(Identifier); // Identifier is implementing the MyInterface
Instance = Activator.CreateInstance(type) as MyInterface;
// Do something with the Instance
Run Code Online (Sandbox Code Playgroud)
将项目修改为.Net 4.0之后,我注意到当二进制文件放在LocalLow目录中时插件崩溃(它在其他地方工作).我的下一步是创建一个简约插件,用尽可能少的代码来找出问题.我注意到动态程序集加载失败,出现以下异常,
System.IO.FileLoadException: Could not load file or assembly '<assemblyPath>' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515 (COR_E_NOTSUPPORTED)) --->
System.NotSupportedException: An attempt was made to load an assembly from a network location which would have caused the …Run Code Online (Sandbox Code Playgroud) 无法加载文件或程序集'NCrawler.GeckoProcessor,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.
我打电话的时候 CrawlUsingGeckoProcessor.Run();
这是什么意思?我可以点击"转到定义",我可以看到Run()方法.
我在运行时遇到以下错误"从ASP.net 2.0网站调用vb.net 1.1程序集时,加载此程序集将从其他实例生成不同的授权集".知道这个错误背后的原因是什么?
场景是:
有一个Web应用程序在ASP.NET 2.0中构建为WebSite.这个网站上的网页加载了一个2.0 vb.net程序集,用于加载1.1 vb.net程序集.
在加载1.1 dll的程序集时,代码在运行时失败.请帮忙.
我将我的类的一个实例序列化为一个文件(带有BinaryFormatter)
之后,在另一个项目中,我想反序列化这个文件,但没有成功,因为我的新项目没有我旧类的描述。在.Deserialize()收到一个异常
Unable to find assembly '*MyAssembly, Version=1.9.0.0, Culture=neutral, PublicKeyToken=null'.*".
Run Code Online (Sandbox Code Playgroud)
但是我有包含我想要反序列化的旧类的描述的程序集的 .DLL。
我不想在项目中添加对 this DLL 的引用(我希望能够反序列化任何类型程序集的类......)
如何通知序列化器/反序列化器使用我动态加载的程序集?
我在汇编中调试了CLR代码,并且排成一行
mov rax, qword ptr [ff4053c0h]
Run Code Online (Sandbox Code Playgroud)
我想qword ptr [ff4053c0h]是指我感兴趣的字符串,但ff4053c0h不是有效的内存位置.阅读qword ptr它似乎引用了一个基于基址寄存器的地址(例如qword ptr [rsp+30h],堆栈中有30个字节),但是我找不到没有基址寄存器的含义.
试图理解这个程序集绑定失败 - 下面的日志中"后策略引用"的含义是什么?
LOG: This bind starts in default load context.
LOG: Using application configuration file: E:\approot\WorkerRole.dll.config
LOG: Using host configuration file:
LOG: Using machine configuration file from D:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Microsoft.WindowsAzure.Diagnostics, Version=2.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///E:/approot/Microsoft.WindowsAzure.Diagnostics.DLL.
LOG: Assembly download was successful. Attempting setup of file: E:\approot\Microsoft.WindowsAzure.Diagnostics.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: Microsoft.WindowsAzure.Diagnostics, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
WRN: Comparing the assembly name resulted in the mismatch: …Run Code Online (Sandbox Code Playgroud) 我正在Visual Studio中开发一个SQL Server数据库项目,它实际上是一个用户定义的函数.在这个项目中,我将Json.NET作为参考(使用NuGet).
我设法通过首先打开数据库TRUSTWORTHY ON(因为我的项目是UNSAFE)然后运行它来发布(并使工作)我的程序集和UDF到我的SQL Server实例:
CREATE ASSEMBLY [System.Runtime.Serialization]
FROM 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Runtime.Serialization.dll'
WITH PERMISSION_SET = UNSAFE;
Run Code Online (Sandbox Code Playgroud)
原来是Json.NET所依赖的程序集(如果我不这样做,我会收到错误)
与此同时,我读到了TRUSTWORTHY ON可能变得多么糟糕,我试图采用非对称键方式来避免打开它.
甚至在签署我自己的程序集之前,我知道我必须创建一个密钥, System.Runtime.Serialization因为我的项目依赖于Json.Net,而Json.Net依赖于它,但是当我运行它时,我得到了这个:
USE [master];
GO
CREATE ASYMMETRIC KEY [SystemRuntimeSerializationKey]
AUTHORIZATION [dbo]
FROM EXECUTABLE FILE = 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Runtime.Serialization.dll';
GO
Msg 15468, Level 16, State 5, Line 3
An error occurred during the generation of the asymmetric key.
Run Code Online (Sandbox Code Playgroud)
这对我没什么帮助.
那么是否可以为.NET框架程序集生成这样的密钥,或者它是否存在将TRUSTWORTHY打开的其他解决方法?
在一个项目中有几个对Ninject库的引用,它们有自己的版本,单元测试失败,错误:
消息:System.IO.FileLoadException:无法加载文件或程序集'Ninject,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = c7192dc5380945e7'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(来自HRESULT的异常:0x80131040)---- System.IO.FileLoadException:无法加载文件或程序集'Ninject,Version = 3.2.0.0,Culture = neutral,PublicKeyToken = c7192dc5380945e7'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
1- csproj文件
<Reference Include="Ninject, Version=3.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL">
<HintPath>..\packages\Ninject.3.2.2.0\lib\net45-full\Ninject.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)
2- packages.config
<package id="Ninject" version="3.2.2.0" targetFramework="net462" />
Run Code Online (Sandbox Code Playgroud)
3- app.config
<dependentAssembly>
<assemblyIdentity name="Ninject" publicKeyToken="c7192dc5380945e7" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
4-参考文件夹 - >展开 - >右键单击Ninject - >属性
Version: 3.2.0.0
Run Code Online (Sandbox Code Playgroud)
看起来像我的项目中的某个地方引用了版本4.0.0.0和3.2.0.0我只想引用版本3.2.2.0.
怎么做?
这些参考文献之间有什么区别?
假设我有一个 Nuget 库,它编译为netstandard2.0支持netcoreapp2.1和net471.
现在,在编译时,我不知道我是否在net471、netcoreapp2.1或下运行(我强调这一点是因为我不能将我的 dll 编译为 和,netstandard2.0netstandard因为net471如果调用程序集是netstandard2.0,我仍然不知道什么关于入口组件)。
我如何在运行时知道我正在运行哪个 TargetFramwork?
我知道有一个这样的解决方案:
Assembly.GetEntryAssembly()?
.GetCustomAttribute<TargetFrameworkAttribute>()?
.FrameworkName
Run Code Online (Sandbox Code Playgroud)
但是,如果您在 MSTest 和 中运行此net471命令Assembly.GetEntryAssembly() == null,那么我不想破坏使用我的 Nuget 的项目中的测试。