真的很简单.我已经将.Net 2-3.5的解决方案升级到.Net 4,它工作正常,我已经安装了VS 2012并使用它.Net 4.5我现在在尝试反映来自一个CustomAttributes时遇到ExecutionEngineException使用以下代码动态生成DLL:
Assembly assembly = Assembly.LoadWithPartialName("DavesNamespace.Custom");
var attributes = assembly.GetCustomAttributes(typeof(ChecksumAttribute), true);
Run Code Online (Sandbox Code Playgroud)
我得到了有或没有为GetCustomAttributes指定的Type的异常,但只是在那一点上它抛出异常,程序集成功加载,如果我坚持一个断点,我实际上可以查看CustomAttributes集合.
自安装vs2012以来,最初的.Net 2-3.5版本仍然有效.
任何帮助非常感谢,我发现一些问题源自vs2012以ExecutionEngineExceptions在线查看,但没有答案.这个问题可以通过删除VS2012和.Net 4.5来解决,但是因为我们打算在它发布时转移到VS2013公司,这不是真正的解决方案.
编辑:在示例应用程序中出现错误,即使应用程序是针对4.5构建的,仍然会抛出异常
堆栈跟踪在下面的评论中添加(它为空)
我有.NET程序集文件,我需要它在MATLAB中工作.(该库是用C#创建的,我有相应的源代码)
在文档之后,我发现以下命令将在MATLAB中加载程序集并使其类可用于"在MATLAB中".但它似乎没有起作用.我用它来加载文件:
color = NET.addAssembly('c:\path\to\file\EvolutionMapsClassLib.dll');
Run Code Online (Sandbox Code Playgroud)
加载很好,我在工作区中看到一个1x1 .NET程序集对象.当我输入时,color我得到以下结果:
color =
NET.Assembly handle
Package: NET
Properties for class NET.Assembly:
AssemblyHandle
Classes
Structures
Enums
GenericTypes
Interfaces
Delegates
Run Code Online (Sandbox Code Playgroud)
所以显然它已经正确加载,而且打字color.Classes提供以下内容:
>> color.Classes
ans =
'EvolutionMaps.EvolutionMap'
'EvolutionMaps.EvolutionMap+EstimationResults'
'EvolutionMaps.PrincipalDirectionEvolutionMap'
'EvolutionMaps.CharacterDimensionsEstemator'
'EvolutionMaps.MapBlob'
'EvolutionMaps.MapsMetric'
'EvolutionMaps.MapsMetric+MapMinimalComparable'
'EvolutionMaps.MapsL2Distance'
'EvolutionMaps.DiagonalEvolutionMap'
'EvolutionMaps.EvolutionMapGenerator'
'EvolutionMaps.HeightEvolutionMap'
'EvolutionMaps.FullnessEvolutionMap'
'EvolutionMaps.YvalEvolutionMap'
'EvolutionMaps.ImageExtractor'
'EvolutionMaps.HorisontalProjectionDistance'
'EvolutionMaps.StrokeWidthEvolutionMap'
'EvolutionMaps.ConnectedComponentsFinder'
'EvolutionMaps.ColorMap'
'EvolutionMaps.ColorMap+GrayColorMap'
'EvolutionMaps.ColorMap+JetColorMap'
'EvolutionMaps.TransitionAvgEvolutionMap'
'EvolutionMaps.PrincipalProjectionEvolutionMap'
'EvolutionMaps.ConnectedComponent'
'EvolutionMaps.WidthEvolutionMap'
Run Code Online (Sandbox Code Playgroud)
这似乎运作良好,但根据在线帮助,为了与这些类进行交互,我需要知道方法和属性.
这是我遇到问题的地方,既不是properties也不行methods.我尝试了每个变体来获取属性或方法列表但我不断收到此错误:
>> properties color.EvolutionMaps.ColorMap
No properties for class color.EvolutionMaps.ColorMap or no class color.EvolutionMaps.ColorMap.
>> properties color.Classes.EvolutionMaps.ColorMap …Run Code Online (Sandbox Code Playgroud) 我有一种情况,我的代码的一部分是CodeExpressions由用户自己生成的,另一部分是由用户自己生成的(例如:用户只需像往常一样编写代码,然后我会在编译时将其添加到我的程序集中).
是否可以生成包含这两个项目的程序集?警告:这两种方法将包含partial类,因此它们必须位于同一个程序集中.
我想到的另一种方法是将这两种方法转换为字符串表示,然后从该字符串生成程序集,但我怀疑我可以从用户生成的类型中获取源代码(在编译时).
根据这个想法,我可以将CodeExpressions生成的代码写入文本文件并将其与.cs文件结合起来.时间表看起来像这样:
.cs文件的内容.dll从组合源代码中创建一个新的我可以跳过将我生成的CodeDom源写入和读取文本文件的(冗余)步骤,并简单地将其写入内存,当然.事实上,使用预处理T4模板并将这些模板的结果加载到内存中并从该字符串编译程序集可能最简单.
正如你所看到的,这是非常混乱的,但现在它看起来是最可行的.我是否看过任何可能使这更容易的选项?
背景:
我正在创建一个库,该库将创建一个包含用户定义的类的程序集.这种方式的工作方式如下:
TinyTypeSetup实例我现在想要添加的是用户可以创建自己的源文件并立即将这些文件添加到生成的程序集中.这将允许用户使用他自己的方法指定部分类,除了我自己生成的那些.
我一直在关注这个StackOverflow问题.它是我能找到的最接近的东西,但并不完全.
让我在我的问题之前解释一下我的最终目标是什么,我正在制作一个支持web的编译器平台,因此,我想在内存中做所有事情(不做任何文件),所以我希望能够编译代码,然后能够引用我刚编译的类中的对象进行任意测试.我知道它听起来有多安全,所以欢迎提供安全方面的意见.
我的问题是如何将C#源代码编译到内存中,并创建该类的实例?
目前我正处于一个步骤,我可以生成有效的.dll并导入并在VisualStudio中手动使用它.
接下来的两个步骤是:
为了完全在记忆中尝试这个,我试过这个.(来源说明)
private object sourceToObj(string source) {
string source = "..."; /*my class*/
CSharpCodeProvider pro = new CSharpCodeProvider();
CompilerParameters params = new CompilerParameters();
params.GenerateInMemory = true;
params.GenerateExecutable = false;
params.ReferencedAssemblies.Add("System.dll");
CompilerResults res = pro.CompileAssemblyFromSource( params, source );
Assembly DOTasm = res.CompiledAssembly;
AppDomain domain = AppDomain.CreateDomain( "thisdomain" );
domain.load( DOTasm , /*???*/ );
domain.CreateInstanceAndUnwrap( DOTasm .FullName, /*???*/ );
return /*???*/;
}
Run Code Online (Sandbox Code Playgroud)
最后,作为代码中的这一点,我希望返回一些对象,我可以调用它的属性.所以打电话 object obj = new sourceToObj(source).class(); …
让我们考虑一些非常简单的C#代码:
static void Main(string[] args)
{
int i = 5;
string s = "ABC";
bool b = false;
}
Run Code Online (Sandbox Code Playgroud)
Jeffrey Richter的“ 通过C#进行CLR ”(第14章)指出,“ String类型是直接从Object派生的,使其成为引用类型,因此,String对象(其字符数组)始终存在于堆中,而不是在线程的堆叠 ”。
在书中的一个示例上也与上面的示例非常相似,它也涉及字符串:“ newobj IL指令构造了一个对象的新实例。但是,IL代码示例中没有newobj指令出现。相反,您看到了特殊的ldstr (负载字符串)IL指令,其通过使用从元数据得到的文字串构成一个字符串对象。这显示了公共语言运行库(CLR)不,事实上,具有构造文字串对象的一种特殊的方式。 “
查看IL代码,显然是这种情况(仅显示了相关部分):
[...]
.locals init (
[0] int32,
[1] string,
[2] bool
)
// (no C# code)
IL_0000: nop
// int num = 5;
IL_0001: ldc.i4.5
IL_0002: stloc.0
// string text = "ABC";
IL_0003: ldstr "ABC"
IL_0008: stloc.1
// bool flag = false;
[...]
Run Code Online (Sandbox Code Playgroud)
所述ldstrIL指令确保了 “ 的对象引用的字符串被压入堆栈 ”。这很有意义-字符串的实例保留在堆上,并且对该对象(其地址)的引用由变量存储在堆栈上。 …
如何告诉我的.NET应用程序在哪里查找所需的特定程序集(除了GAC或运行应用程序的文件夹)?例如,我想将一个程序集放在用户的Temp文件夹中,让我的应用程序知道引用的Assembly在temp文件夹中.
谢谢
我有两个单独的项目,例如project1和project2.那么我在project1中有一个window1,那么如何从project2中显示这个window1.
我使用visual studio 2010来设计网页,我使用了这个图层
编程,我使用gidview和objectdatasource,但我得到这个例外:
"The type 'WebApplication4.view1' is ambiguous: it could come from assembly
'C:\Users\EHSAN\AppData\Local\Temp\Temporary ASP.NET
Files\root\d04444bc\d654bde6\App_Code.i0fp6yrj.DLL' or from assembly
'C:\Users\EHSAN\Documents\Visual Studio
2010\Projects\WebApplication4\WebApplication4\bin\WebApplication4.DLL'. Please
specify the assembly explicitly in the type name."
Run Code Online (Sandbox Code Playgroud)
我把我的代码放在这里:
这是我的web.aspx:
<asp:ObjectDataSource ID="ObjectDataSource1" Runat="server" TypeName="WebApplication4.view1"
SelectMethod="Search" OldValuesParameterFormatString="original_{0}" >
</asp:ObjectDataSource>
Run Code Online (Sandbox Code Playgroud)
这是APP_Code中BAL文件夹中的search.cs文件:
namespace WebApplication4
{
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Data;
public class view1 : System.Web.UI.Page
{
public view1()
{ }
public List<person> Search()
{
List<person> persons = new List<person>();
DataSet ds = PersonsDB.Search();
foreach …Run Code Online (Sandbox Code Playgroud) 这个问题是由我刚刚处理的另一个问题引发的.有一个托管库MyAssembly.dll,面向.NET 4.0.它有自己的MyAssembly.dll.config文件和一些<bindingRedirect>说明.我相信该.config文件是由compliler或NuGet包管理器生成的,因为我没有手动创建它.
问题是,当DLL被客户端应用程序加载时,会忽略绑定指令(RegAsm.exe在我的情况下,我也使用简单的控制台.NET应用程序验证了这一点).我不得不将它们从DLL的.config文件移动到客户端EXE应用程序的.config文件中,由.NET运行时获取并正确解析.
问题:托管库程序集(.DLL)的.config文件的目的是什么?它是否以任何方式参与加载库程序集的过程?
我开发了一个带插件的系统,它在运行时加载程序集.我有一个通用的接口库,我在服务器和它的插件之间共享.但是,当我执行LoadFrom for plugin文件夹并尝试查找实现公共接口的所有类型时,IServerModule我得到运行时异常:
"ServerCore.IServerModule"类型存在于"ServerCore.dll"和"ServerCore.dll"中
我加载这样的插件:
foreach (var dll in dlls)
{
var assembly = Assembly.LoadFrom(dll);
var modules = assembly.GetExportedTypes().Where(
type => (typeof (IServerModule)).IsAssignableFrom(type)
&& !type.IsAbstract &&
!type.IsGenericTypeDefinition)
.Select(type => (IServerModule)Activator.CreateInstance(type));
result.AddRange(modules);
}
Run Code Online (Sandbox Code Playgroud)
我该如何处理这个麻烦?
我会感激任何帮助
.net-assembly ×10
c# ×10
.net ×4
reflection ×2
asp.net ×1
cil ×1
codedom ×1
config ×1
heap-memory ×1
matlab ×1
stack ×1
wpf ×1