我有一个需要在运行时访问的文件,我已将其包含在我的项目中并将其设置为嵌入式资源(它实际上是一个源文件,我将扩展名更改为 .cs.txt 以绕过 VS 尝试编译它.这应该不重要,但我无论如何都会提到它以防万一)。当我尝试获取文件时
var assembly = Assembly.GetExecutingAssembly();
Stream stream = assembly.GetManifestResourceStream(resourceName);
Run Code Online (Sandbox Code Playgroud)
我得到一个空值。我已确保使用 Namespace.Folder.Filename 表示法,但这没有帮助。看来该文件实际上不存在,因为当我打电话时
assembly.GetManifestResourceNames();
Run Code Online (Sandbox Code Playgroud)
我得到一个空字符串数组。知道会发生什么情况吗?
我遇到的情况是,不同的文件夹中有多个 .dll 文件,它们都具有相同的名称,包含相同的函数(具有相同的名称),但具有相同名称的函数内部的代码不同。
我在设计中创建了我的应用程序,引用了这些 .dll 文件之一。但我希望当我的应用程序启动时,使用选择案例能够更改对这些 dll 之一的引用。
这可能吗 ?
谢谢 !
这可能真的很明显,但我已经花了整整两个小时试图找到这个 dll。在哪里可以找到包含与 Microsoft.Ajax.Utilities 相关的所有内容的库?我继承了某人的代码,这是一个传奇。任何帮助深表感谢!
-F
我在项目的根文件夹下有一个证书。项目名称是 SingleSignOn,但我无法使用 GetManifestResourceStream 内置方法读取该方法。
源代码是
namespace SingleSignOn
{
public class Program
{
static void Main(string[] args)
{
var assembly = typeof(Program).Assembly;
var super = assembly.GetManifestResourceNames();
using (var stream = assembly.GetManifestResourceStream("SingleSignOn.idsrv3test.pfx"))
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
NULL我从上述内置方法中得到GetManifestResourceStream
我不知道我在这件事上错过了什么。所述证书的URL是https://github.com/IdentityServer/IdentityServer3.Samples/blob/master/source/Certificates/idsrv3test.pfx
请帮助我如何阅读证书。
这是我关于堆栈溢出的第一个问题。我试图寻找一种解决方案,但在任何地方都找不到一个或类似的解决方案。
我有一个 MVC 网站项目,它有不同的 DLL(插件),由于这些 DLL 不需要部署在所有环境中,所以我从文件夹中的 Global.asax 中的 Application_Start 上动态加载它们,并仅部署每个环境所需的内容。所以我不知道在项目中引用它们,这样我就可以为所有人构建一个版本。
我的问题是 Type.GetType("FullClassName, AssemblyName") 总是在这些插件中的对象上返回 null。
在 Application_Start 上,我基本上加载一个程序集,将其注册到 GAC,将其加载到当前 AppDomain 中,初始化其元数据并使用反射运行其引导程序,以在全局 Unity 容器中注册组件。
foreach (string file in fileList) {
string fileName = (Path.GetFileName(file));
Assembly asm = Assembly.LoadFrom(file);
foreach (Type assemblyType in asm.GetTypes()) {
new System.EnterpriseServices.Internal.Publish().GacInstall(file);
AppDomain.CurrentDomain.Load(asm.GetName());
MetaDataHelper.InitialiseMetadataForAssembly(asm);
IBootstrapper bootsrapper = (IBootstrapper)Activator.CreateInstance(assemblyType, container);
bootsrapper.Initialise();
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过这种方法,对我的程序集进行强命名并将它们添加到 web.config 中,但没有效果。
<dependentAssembly>
<assemblyIdentity name="MyAssembly" culture="neutral" publicKeyToken="123456789"/>
<codeBase version="1.0.1524.23149" href="FILE://C:/Myassemblies/MyAssembly2.dll"/>
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗我错过了什么吗?
提前致谢。
我有一个 VB.Net Windows 窗体应用程序。我已将 C# 类库添加到具有 VB.Net Windows 窗体应用程序的解决方案中。我编译了 C# 类库,并添加了对 VB.Net Windows 窗体应用程序的引用。但是,当我尝试添加 C# 类库的命名空间时,它并没有显示在智能感知中。因此我无法访问 C# 类及其函数。有人请告诉我解决这个问题的方法。谢谢
我正在构建一个动态方法,使用 ILGenerator 插入操作码。我正在使用 Visual Studio 插件查看 DynamicMethod 中的 IL 代码,因此这不是问题。
不过,我希望看到 JITer 发出的最终 x86 代码。无论我如何尝试,Visual Studio 2017 都不会让我进入 x86 汇编代码。它在堆栈中显示为“轻量级函数”,VS 将直接跳过它。
有没有办法查看编译 DynamicMethod 生成的 x86 汇编代码?
在 C++ 项目中,我可以使用版本资源文件中的VERSIONINFO将不同的产品版本和文件版本值添加到程序集中:
#define VER_PRODUCTVERSION 1,0,0,0
#define VER_PRODUCTVERSION_STR "1.0\0"
#define VER_FILEVERSION 1,0,0,1
#define VER_FILEVERSION_STR "1.0.0.1\0"
Run Code Online (Sandbox Code Playgroud)
这在 DLL 属性中显示为:
我在 C# 项目中无法实现相同的目标。我在 AssemblyInfo.cs 文件中设置了以下内容:
[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.0.1")]
Run Code Online (Sandbox Code Playgroud)
但是,在 DLL 属性中,两者都设置为“文件版本”的值:
如何在 C# DLL 中将产品版本和文件版本设置为不同的值?我正在使用 Visual Studio 2019。
我正在使用 VS2019 并在项目设置中启用了可为空检查语义。我正在尝试使用程序集获取可执行文件的路径,如下所示:
var assembly = Assembly.GetEntryAssembly();
if (assembly == null)
{
throw new Exception("cannot find exe assembly");
}
var location = new Uri(assembly.GetName().CodeBase);//doesn't compile.
Run Code Online (Sandbox Code Playgroud)
它说,“assembly”是一个 [Assembly?] 类型,而 Uri ctor 需要一个字符串,编译错误是:
error CS8602: Dereference of a possibly null reference.
Run Code Online (Sandbox Code Playgroud)
如何修复我的代码以使其编译?非常感谢。
我通过C#执行.NET程序集时遇到了一些重大问题.我想从静态类调用静态方法(Main).我让它在当前域中工作,但显然我无法从那里卸载程序集.
首先,我尝试创建一个新的AppDomain:
AppDomain domain = AppDomain.CreateDomain("PluginDomain");
Run Code Online (Sandbox Code Playgroud)
由于我的主要问题是解析我正在尝试加载的程序集,我试图挂钩AssemblyResolve事件:
domain.AssemblyResolve += new ResolveEventHandler(this.OnAssemblyResolve);
Run Code Online (Sandbox Code Playgroud)
但是,我得到一个关于序列化的错误(即这个类).
我已成功加载一个汇编文件,它恰好位于BaseDirectory中,只需使用:
domain.Load("Assembly1");
Run Code Online (Sandbox Code Playgroud)
但有问题的程序集位于BaseDirectory的两个子目录中,即.BaseDirectory\dir1\dir2\Assembly2.dll - 当使用带有字符串程序集名称的domain.Load()(将PrivateBinPath安装到正确的子目录位置)时以及使用带有程序集字节的domain.Load()时,我得到FileNotFoundException (来自File.ReadAllBytes()).
我知道AppDomain.Load()已被删除,但它似乎是唯一可用的方法,考虑到我不想强制包含静态方法的类是非静态和可实例化的.
无论如何,我该怎么做才能确保汇编文件正确加载到新的AppDomain中?
我的主要目标是从程序集中动态执行一个方法,该方法可以调用我自己的程序,但必要时也必须完全卸载程序集.它的目的是成为一个插件系统.