所以,我有一个使用StructureMap的.NET解决方案,我想让StructureMap读取一个外部程序集,该程序集实现该解决方案中项目的接口并为其定义注册表项.
我的解决方案的StructreMap配置:
ObjectFactory.Initialize(registry =>
{
registry.Scan(assembly =>
{
assembly.TheCallingAssembly();
//Telling StructureMap to sweep a folder called "extensions" directly
//underneath the application root folder for any assemblies found in that folder
assembly.AssembliesFromPath("extensions", addedAssembly => addedAssembly.GetName().Name.ToLower().Contains("extension"));
//Direct StructureMap to add any Registries that it finds in these assemblies, assuming that all the StructureMap directives are
//contained in registry classes
assembly.LookForRegistries();
});
});
Run Code Online (Sandbox Code Playgroud)
非常简单,我告诉它将调用程序集和程序集从目录添加到程序集集合中.我调试了程序集变量,它确实找到了所有程序集(包括扩展目录中的程序集).
在我创建的DLL项目中,我独立于原始解决方案,我有一个接口的实现(我从原始解决方案中引用了interfaces项目),并编写了一个非常简单的注册表:
public class ProductMockRegistry : Registry
{
public ProductMockRegistry()
{
ForRequestedType<IProductRepository>().AddInstances(repository =>
{
repository.OfConcreteType<ProductMockRepository>();
});
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,StructureMap没有在外部DLL中找到注册表.它发现DLL很好,但是当我告诉LookForRegistries时,它找不到它.
我正在尝试通过挂钩AppDomain.AssemblyResolve和AppDomain.ReflectionOnlyAssemblyResolve事件来加载一些模块.虽然我让前者工作,但我对后者失败了.我把问题归结为这个小程序:
public static class AssemblyLoader
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve +=
ReflectionOnlyAssemblyResolve;
// fails with FileNotFoundException
Assembly.ReflectionOnlyLoad("Foo");
}
public static Assembly ReflectionOnlyAssemblyResolve(object sender,
ResolveEventArgs args)
{
Trace.TraceInformation(
"Failed resolving Assembly {0} for reflection", args.Name);
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
运行此程序失败,FileNotFoundException尝试时Assembly.ReflectionOnlyLoad,但它不会调用ReflectionOnlyAssemblyResolve处理程序.我很难过.
有没有人知道这可能是什么原因以及如何让它发挥作用?
谢谢!
我正在尝试将类路径添加到由maven-assembly-plugin生成的jar中.组件bulid,除了manifest没有类路径.以下是我的配置.任何帮助,将不胜感激.谢谢!
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptors>
<descriptor>assembly/package.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>mymain.Main</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud) 我想知道在.NET解决方案中引用程序集的各种成本是多少.我对技术和组织成本感兴趣.
一些例子:
有没有办法检查是否满足.Net程序集所需的所有依赖项?它位于生产服务器上,并且未安装Visual Studio.
它是一个.Net程序集,需要一些GAC:ed组件,这些组件不包含在安装包中.
我正在使用Activator基于程序集的短名称来实例化一个新类(例如'CustomModule').它抛出一个FileNotFoundException,因为装配不在那里.有没有办法检查是否存在某个程序集名称?
我正在使用以下代码:
System.Runtime.Remoting.ObjectHandle obj =
System.Activator.CreateInstance(assemblyName, className);
Run Code Online (Sandbox Code Playgroud)
主要目标是测试组件的存在而不是等待异常发生.
我的应用程序加载位于其执行路径中的所有库程序集,并对包含的类执行预先知道的方法.
我现在需要对引用我的应用程序集的程序集执行相同的操作.这是可能的吗?我应该注意哪些负面影响?
大师集会:
public abstract class TaskBase
{
public abstract void DoWork();
}
LoadAssemblyFromFile("Assembly0001.dll");
Assembly0001.Task1.DoWork();
Run Code Online (Sandbox Code Playgroud)
儿童大会:
public sealed class Task1: MasterAssembly.TaskBase
{
public override void DoWork { /* whatever */ }
}
Run Code Online (Sandbox Code Playgroud) 如何创建appdomain,向其添加程序集,然后销毁该app域?这是我尝试过的:
static void Main(string[] args)
{
string pathToExe = @"A:\Users\Tono\Desktop\ConsoleApplication1.exe";
AppDomain myDomain = AppDomain.CreateDomain("MyDomain");
Assembly a = Assembly.Load(System.IO.File.ReadAllBytes(pathToExe));
myDomain.Load(a.FullName); // Crashes here!
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
myDomain.Load(File.ReadAllBytes(pathToExe));
Run Code Online (Sandbox Code Playgroud)
如何将程序集添加到appdomain.一旦我这样做,我可以通过反射找到方法执行它,然后销毁appdomain
我得到的例外是:
无法加载文件或程序集"ConsoleApplication1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null"或其依赖项之一.该系统找不到指定的文件.
作为一个上下文,我正在开发一个ASP.NET MVC 5应用程序,该应用程序通过Microsoft的OWIN实现使用基于OAuth的身份验证,仅在此阶段用于Facebook和Google.目前(截至v3.0.0,git-commit 4932c2f),FacebookAuthenticationOptions并且GoogleOAuth2AuthenticationOptions没有提供任何属性来强制Facebook或Google分别在登录时重新验证用户(通过附加相应的查询字符串参数).
最初,我开始重写以下类:
FacebookAuthenticationOptionsGoogleOAuth2AuthenticationOptionsFacebookAuthenticationHandler(具体AuthenticateCoreAsync())GoogleOAuth2AuthenticationHandler(具体AuthenticateCoreAsync())但发现这些~AuthenticationHandler类被标记为internal.
所以我为Katana项目提取了一份源代码(http://katanaproject.codeplex.com/)并相应地修改了源代码.
编译之后,我发现有几个依赖项需要更新才能在MVC项目中使用这些更新的程序集(Microsoft.Owin.Security.Facebook和Microsoft.Owin.Security.Google):
这是通过将现有项目引用替换为3.0.0版本并在web.config中更新它们来完成的.好消息:该项目编制成功.
在调试中,我在启动时收到异常:
[MVC web assembly] .dll中出现'System.IO.FileLoadException'类型的异常,但未在用户代码中处理
附加信息:无法加载文件或程序集"Microsoft.Owin.Security,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
基本的异常表明Microsoft.AspNet.Identity.Owin试图加载的V2.1.0 Microsoft.Owin.Security打电话时app.UseExternalSignInCookie()从Startup.ConfigureAuth(IAppBuilder app)在Startup.Auth.cs.
不幸的是,程序集(及其它依赖项,Microsoft.AspNet.Identity.Owin)不是Project Katana解决方案的一部分,我无法在线找到这些程序集的任何可访问存储库.
Microsoft.AspNet.Identity程序集是否开源,如Katana项目?有没有办法欺骗这些程序集使用引用的v3.0.0程序集而不是v2.1.0?该
/bin文件夹包含Owin程序集的3.0.0版本.
我已经为Microsoft.AspNet.Identity.Owin升级了NuGet包,这仍然是一个问题.
有关如何解决此问题的任何想法?
assemblies ×10
.net ×5
c# ×4
reference ×2
reflection ×2
activator ×1
appdomain ×1
c#-2.0 ×1
clr ×1
dependencies ×1
manifest ×1
maven-2 ×1
owin ×1
performance ×1
registry ×1
runtime ×1
structuremap ×1