我想遍历我在项目中添加的所有类
Assembly[] foo = AppDomain.CurrentDomain.GetAssemblies();
foreach(Assembly a in foo)
{
foreach(Type t in a.GetTypes())
{
}
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试但我想排除.net提供的程序集,例如"mscorlib"
我想使用反射在 GAC 中动态加载程序集的最新安装版本。
到目前为止,我已经找到了多种工作方法来实现这一点,但它们都有其特定的缺点。
最简单的解决方案是使用该Assembly.LoadWithPartialName()方法。但此方法自 .NET Framework 2 起已过时:
var assembly = Assembly.LoadWithPartialName("Microsoft.WindowsAzure.ServiceRuntime");
Run Code Online (Sandbox Code Playgroud)
另一种可能性是使用Assembly.Load()(如过时警告所推荐的)并在 try/catch 块中使用其完全限定的程序集名称调用不同的程序集版本以获取最新安装的版本。这是维护的尖叫声,看起来很脏:
Assembly assembly = null;
try
{
assembly = Assembly.Load("Microsoft.WindowsAzure.ServiceRuntime, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
}
catch (FileNotFoundException) { }
try
{
assembly = Assembly.Load("Microsoft.WindowsAzure.ServiceRuntime, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
}
catch (FileNotFoundException) { }
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的是,我在 SO 上找到了另一个解决方案,使用该 Assembly.LoadFrom()方法,然后基本上导入程序集管理器模块fusion.dll以找出最新版本的路径。对于这样一个“简单”的任务来说,这似乎太过分了。
如果不使用过时的方法、使用魔法字符串创建维护地狱或通过调用非托管代码,就没有更好的解决方案来实现这一目标吗?
提前致谢!
我想在集成测试中动态创建程序集,以便测试一些程序集操作类.如果我使用以下代码来创建测试程序集:
var domain = AppDomain.CurrentDomain;
var builder = domain.DefineDynamicAssembly(
new AssemblyName(assemblyName),
AssemblyBuilderAccess.Save,
directory);
builder.Save(fileName);
Run Code Online (Sandbox Code Playgroud)
然后一切运行正常,程序集在所需的位置创建,但作为其中一部分,它们也加载到当前AppDomain,我不想要.
所以我想使用单独的创建程序集AppDomain:
var domain = AppDomain.CreateDomain("Test");
...
Run Code Online (Sandbox Code Playgroud)
但是运行代码会在该行引发异常var builder = domain.DefineDynamicAssembly(...);:
System.Runtime.Serialization.SerializationException:在程序集'mscorlib中键入'System.Reflection.Emit.AssemblyBuilder',Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'未标记为可序列化.
我不知道这与呼叫DefineDynamicAssembly非当前有什么关系AppDomain.我在网上找到的主要是关于在不同的域中执行程序集.也许我在这里尝试做的只是太具体,太高级甚至根本不推荐,但它可以让我测试我们所有的装配操作代码.
有人可以指点我正确的方向吗?
这是一个复杂的问题,涉及与 COM、CLR 和无 reg-free COM 相关的一些神秘领域。
首先,我的主要应用程序是用 python 编写的。因此,它的代码库(开发中)位于 C:\mainapp\main.py。
当然,在windows上,执行程序的是C:\Python27\python.exe。
我现在想使用 python 中的 reg-free COM(使用 win32com)与我控制的用 C# 编写的 COM 对象交谈(使用 IDispatch),该对象位于 C:\mainapp\ManagedCOMObject.dll
注意:如果您不会说 python / pythoncom,请注意对 Dispatch() 的调用最终归结为 CoCreateInstance()。
#main.py:
import win32com.client
CLSID_ManagedComObject_MyClass = "{zzzzz....}" #This is correct
myclass = win32com.client.Dispatch(CLSID_ManagedComObject_MyClass)
Run Code Online (Sandbox Code Playgroud)
失败,因为对象不在注册表中(正如预期的那样),而且我没有提到任何关于清单文件的内容,而且 python.exe 的清单显然不知道我的对象。
#main.py:
ac = ActivationContext("C:\mainapp\myapp.manifest", asm_dir="C:\mainapp")
with ac.activate():
#The above two lines fill in a ACTCTX structure, call CreateActCtx, and call ActivateActCtx
import win32com.client
CLSID_ManagedComObject_MyClass = "{zzzzz....}" #This is correct
myclass …Run Code Online (Sandbox Code Playgroud) 拥有一个物理编码在多个.cs文件中的单个文件程序集和一个具有多个.NetModules的多文件程序集之间有什么区别和优势?
我的教授说,当这些组件加载或在jitting期间可以实现差异.并非所有多文件程序集的.Netmodules都会立即加载.但即使他不确定.有人能澄清我吗?
在应用程序开发过程中,我一直在运行"ngen install ...".但是在这些程序集被覆盖之前,没有在某些版本/方案(调试等)上运行"ngen uninstall ...".现在,我在"C:\ Windows\assembly\NativeImages_v4.0.30319_64\AssemblyName\hashkey"格式的文件夹中看到许多*.ni.exe和*.ni.dll.(dll也是内部开发的.)
我正在使用.Net 4.
反正有没有卸载这些?我试过"ngen update"它似乎没有触及这些孤立的原生图像.当然我可以手动删除它们,但它会扰乱我的程序集所依赖的系统dll上的引用计数,或者对.net系统造成更糟糕的后果.
除了占用空间之外,这些较旧的程序集会损害启动延迟,因为程序集绑定程序试图将当前IL与每个本机程序集进行匹配.
还有一种更好的方法来查看本机映像缓存中的内容而不是使用命令行吗?
谢谢
我有一个WCF服务,让我们说在IIS中托管的程序集A. WCF服务引用另一个程序集,比如程序集B,它需要访问程序集A的Assembly对象.
原因:我想通过额外的合同和该合同的默认实现来扩展现有的WCF服务,这可以返回WCF服务程序集的FILE VERSION.
请参阅下面的代码:
程序集A(WCF服务):
web.config:除地址"B"下的现有2个端点外,还添加了新端点
<configuration>
<system.serviceModel>
<services>
<service name="ExistingServiceHandler">
<endpoint address="mex" kind="mexEndpoint"/>
<endpoint address="" binding="basicHttpBinding" contract="IExistingContract"/>
<endpoint address="B" binding="basicHttpBinding" contract="AssemblyB.IServiceContract"/>
</service>
...
Run Code Online (Sandbox Code Playgroud)
现有实现:现在扩展程序集B中的"实现".
public class ExistingServiceHandler : Implementation, IExistingContract
{
// Whatever methods are implemented here
}
Run Code Online (Sandbox Code Playgroud)
程序集B(C#类库):
[ServiceContract]
public interface IServiceContract
{
[OperationContract]
string ServiceVersion();
}
public class Implementation : IServiceContract
{
public string ServiceVersion()
{
string assemblyLocation = Assembly.GetEntryAssembly().Location;
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assemblyLocation);
string fileVersion = fvi.FileVersion;
return fileVersion;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下(在程序集B中),但没有一个返回正确的程序集:
Assembly.GetEntryAssembly(); // returns …Run Code Online (Sandbox Code Playgroud) 我的.NET应用程序可以将同一程序集的多个版本加载到内存中.程序集未签名,但每次编译和装载新的程序集时,它都会自动获得一个新的程序集版本(小部分).我对类型没有任何问题,因为实例化ob对象是受控制的,所以我知道对象是从哪个程序集创建的.
自从VS 2003以来,这一直在运行,但是在最新的VS 2015中,这个场景的调试被打破了.一切正常,只有单个版本的程序集加载到内存中,但每当加载第二个版本时,所有Locals/Watch窗口都变空.并尝试评估QuickWatch中的任何表达式都会产生编译器异常"错误CS1704:已导入具有相同简单名称'MyAssembly'的程序集.请尝试删除其中一个引用(例如'MyAssembly.dll')或将其签名以启用并排侧".
以下是VS2013和VS2015附加调试器的相同应用程序的屏幕截图(加载两个程序集时):
所以这使得VS 2015的调试几乎不可能.
由于最初这是一个compliler错误(据我所知,在VS 2015调试器的封面下使用)互联网搜索不是很有用.这是我能找到的唯一与调试器问题相关的链接: Visual Studio Debugger无法检查变量.与我的情况不同的是,在内存中有两个程序集是一个错误,而在我的情况下,这是一个意图.
所以现在我在思考我的选择.
那么可能有人可以提出更多想法吗?Thnaks.
我正在将一个控制台应用程序移植到.NET核心,它从外部库加载类型.在程序Type.GetType("typename, assemblyname")集位于可执行文件所在的同一文件夹中时,使用完整的.NET Framework 工作.
在.NET Core中,无论何处放置库,它都返回null.
作为一种解决方法,我已经安装了System.Runtime.Loader包并附加到Resolving事件以强制从完整路径加载:
AssemblyLoadContext.Default.Resolving += Default_Resolving;
type = Type.GetType(value);
Run Code Online (Sandbox Code Playgroud)
代表是:
private static Assembly Default_Resolving(AssemblyLoadContext context, AssemblyName assembly)
{
return context.LoadFromAssemblyPath(Path.Combine(Directory.GetCurrentDirectory(), @"bin\Debug\netcoreapp1.1", $"{assembly.Name}.dll"));
}
Run Code Online (Sandbox Code Playgroud)
问题是:在加载外部程序集时,.NET核心在哪里查找?
更新到VS 2017的最新版本(版本15.3.2)后,我从Unity生成的Hololens版本仍然没有收到此消息:
命令""C:\ TestFile\HoloBuild\VSApp\Unity\Tools\AssemblyConverter.exe"-platform = uap -lock ="C:\ TestFile\HoloBuild\VSApp\HoloBuild\project.lock.json"-bits = 32 -configuration = Debug -removeDebuggableAttribute = False -uwpsdk = 10.0.15063.0 -path ="." - path ="C:\ Program Files\Unity\Editor\Data\PlaybackEngines\MetroSupport\Players\UAP\dotnet\x86\Debug" "C:\ TestFile\HoloBuild\VSApp\HoloBuild\Assembly-CSharp.dll""C:\ TestFile\HoloBuild\VSApp\HoloBuild\UnityEngine.dll""C:\ TestFile\HoloBuild\VSApp\HoloBuild\UnityEngine.Analytics. dll""C:\ TestFile\HoloBuild\VSApp\HoloBuild \nunit.framework.dll""C:\ TestFile\HoloBuild\VSApp\HoloBuild\UnityEngine.UI.dll""C:\ TestFile\HoloBuild\VSApp\HoloBuild\UnityEngine.HoloLens.dll""C:\ TestFile\HoloBuild\VSApp\HoloBuild\UnityEngine.Networking.dll""C:\ TestFile\HoloBuild\VSApp\HoloBuild\UnityEngine.VR.dll""已退出,代码为1. HoloBuild C :\ TestFile\HoloBuild\VSApp\HoloBuild\HoloBuild.csproj 292
我在构建输出中有这个错误:
1> System.Collections.Generic.KeyNotFoundException:给定的键不在字典中.(TASKID:275)
1> at System.Collections.Generic.Dictionary`2.get_Item(TKey key)(TaskId:275)
1>在UnityEditor.Scripting.Compilers.NuGetPackageResolver.Resolve()(TaskId:275)
1>在Unity.UWPAssemblyResolver..ctor(String projectLockFile,String desiredUWPSDKVersion)(TaskId:275)
1>在Unity.OperationContext.SetPlatform(平台平台,String projectLockFile,String uwpSDK)(TaskId:275)
1>在Unity.ParseArgsStep.Execute()(TaskId:275)
1>在Unity.Step.Execute(OperationContext operationContext,IStepContext previousStepContext)(TaskId:275)
1>在Unity.Operation.Execute()(TaskId:275)
1>在Unity.Program.Main(String [] args)(TaskId:275)
我已尝试过许多新项目,但结果与相同的错误消息相同.
正如在一些线程中所建议的那样,我尝试删除并添加一些引用,尝试搞乱Unity中的一些构建设置.
我完全不确定这个问题是因为更新了Visual Studio.有没有人遇到同样的问题?我怎样才能建立我的项目?