标签: clr-hosting

自定义AppDomainManager无法启动runtimeHost

我有以下appDomainManager代码

public class HostAppDomainManager : AppDomainManager
{
    public override void InitializeNewDomain(AppDomainSetup appDomainInfo)
    {
        this.InitializationFlags = AppDomainManagerInitializationOptions.RegisterWithHost;
    }
}
Run Code Online (Sandbox Code Playgroud)

并遵循用于启动运行时主机的非托管代码

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    ICLRMetaHost *pMetaHost       = NULL; 
    HRESULT hr;  
    ICLRRuntimeInfo *runtimeInfo = NULL;     
    __try 
    { 
        hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost); 
        hr = pMetaHost->GetRuntime(L"v4.0.30319",IID_ICLRRuntimeInfo,(LPVOID*)&runtimeInfo); 
        ICLRRuntimeHost *runtimeHost  = NULL; 
        hr = runtimeInfo->GetInterface(CLSID_CLRRuntimeHost,IID_ICLRRuntimeHost, (LPVOID*)&runtimeHost);     
        ICLRControl* clrControl = NULL; 
        hr = runtimeHost->GetCLRControl(&clrControl); 
        hr = clrControl->SetAppDomainManagerType(L"ExceptionThrower.dll",L"ExceptionThrower.HostAppDomainManager");
        hr = runtimeHost->Start();  
    } 
    __except(1) 
    { 
        wprintf(L"\n Error thrown %d",e); 
    } 
    return 0; 
} 
Run Code Online (Sandbox Code Playgroud)

对runtimeHost-> Start()的调用失败,错误代码为-2146233054,cansomeone指出我应该怎么做才能解决这个问题?

c# .net-4.0 clr-hosting

6
推荐指数
1
解决办法
670
查看次数

是否可以在同一进程中加载​​两个版本的.NET运行时?

我需要澄清两种情况:

  1. 使用.NET 3.5编译的可执行文件需要使用使用.NET 1.1编译的库,并且库必须在1.1运行时上运行.

  2. 使用.NET 1.1编译的可执行文件需要使用使用.NET 3.5编译的库.

我找不到一个可靠的来源,说明无法加载两个版本的.NET运行时,而且微软的文档在这个问题上非常模糊.

.net versioning runtime clr-hosting

5
推荐指数
1
解决办法
729
查看次数

跨本机框架捕获托管异常

是否可以通过托管代码抛出托管异常,但是调用堆栈中存在干预本机帧

我在做这件事时遇到了麻烦.该应用程序是32位本机代码并托管MSCLR 2.0(但大多数代码是.NET 3.5.)

除非完成抛出,否则应用程序运行正常,并且当它抛出时究竟发生了什么取决于它运行的系统.

实际的应用程序非常复杂,所以至少在最初我会发布一些简单的概念代码只是为了说明.本机程序(我们将调用Native.exe)运行一个我们将调用的托管程序Managed.exe.某处内Managed.exe,用C#编写,如下:

class MyException : Exception {}

...

void OuterManaged()
{
    MyObject.MyEvent += ( s, a ) =>
    {
        Console.WriteLine( "Throwing..." );
        throw new MyException();
    }

    try
    {
        MyKernel.DoSomething();
        Console.WriteLine( "Finished" );
    } catch( MyException )
    {
        Console.WriteLine( "Caught" );
    }
}
Run Code Online (Sandbox Code Playgroud)

MyKernel是我们将调用的混合C++/CLI程序集中定义的托管类Glue.dll. MyObject是另一个类的实例Glue.dll.那里的相关方法看起来像这样:

void DoSomething( void )
{
    _pMyNativeKernel->DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

DoSomething是一个Native.exe虚拟调用的C++函数.总而言之,它最终会回归到一种Glue.dll可以提升的管理方法MyEvent …

.net clr exception-handling exception clr-hosting

5
推荐指数
1
解决办法
481
查看次数

C#和非托管本机C++是否有通用的方法来确定已安装的CLR版本?

正如标题所说:C#中是否有一种通用的方式,特别是非托管的本机C++来确定已安装的CLR版本?这意味着不仅要检查是否根据此知识库文章安装了Framework .我想通过使用CLR接口来完成它,就像这里为CLR1,CLR1.1和CLR2 所做的那样.通过这种方式,我可以确保它们真正安装.但这不适用于CLR4.有任何想法吗?

我的目标是创建一个可用的CLR版本的枚举,如Clrver(无论进程列表功能是否正确).

.net c# c++ clr clr-hosting

3
推荐指数
1
解决办法
450
查看次数

如何在同一进程中加载​​的两个.NET CLR相互通信?

现在可以在同一个盒子上运行两个CLR,它们怎么能互相"说话"呢?

假设GUI在.NET 2.0 CLR下运行,并且在.NET 4.0 CLR上运行了一个脚本,例如,有没有办法从4.0环境修改基于2.0的GUI?

当我使用这种技术将.NET C#REPL环境注入另一个.net进程时,我遇到了这个问题:视频:将C#DLL注入托管(C#)和非托管(C++)进程


注意:我在Reddit上问了一个类似的问题,如果您对并行执行和CLR托管主题感兴趣,那么该版本包含大量引用

c# clr clr-hosting clr4.0 dll-injection

3
推荐指数
1
解决办法
1261
查看次数

如何判断XP上运行的应用程序加载了哪个版本的.NET CLR?

我知道在计算机上有explorer.exe加载的托管shell扩展.我想知道什么版本的CLR加载到explorer.exe.如果我正在运行Vista或Win7,我可以使用Process Explorer并查看explorer.exe属性的.NET Assemblies选项卡.但是,这不适用于XP.有没有办法在XP上获取此信息?

.net version clr-hosting

1
推荐指数
2
解决办法
4299
查看次数

用于生成序列号的SQL Server函数

我想有一个SQL Server函数dbo.GetNextNumber(),它将为每个调用生成序列号.据我所知,使用本机T-SQL函数是不可能的,因为SQL Server坚持认为函数必须是确定性的.但是,如果你能告诉我一个原生的T-SQL函数,这将真正成为我的一天.

我想也许可以使用CLR函数编写.由于CLR函数是静态的,序列号需要存储在set操作的调用上下文中,因为将其存储为静态变量将导致使用相同序列的多个连接,从而导致不那么顺序的数字.我对嵌入式CLR知之甚少,看看是否可以从CLR端访问set操作(select,update,delete,insert)调用上下文.

在一天结束时,以下查询

select dbo.GetNextNumber() from sysobjects
Run Code Online (Sandbox Code Playgroud)

必须返回结果

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

如果需要另一个函数调用来重置上下文就好了

exec dbo.ResetSequenceNumbers()
Run Code Online (Sandbox Code Playgroud)

为了防止一些误解并减少浪费时间回答错误问题的机会,请注意我不是在寻找一个表的ID生成函数,而且我知道一些hacks(虽然使用proc而不是函数)涉及到一些带有标识列的临时表.该ROW_NUMBER()功能是接近,但它也不会削减.

非常感谢任何回复

凯末尔

PS令人惊讶的是,SQL Server确实具有内置功能.一个函数(假设它不能在连接和where子句中使用)非常容易实现并且非常有用,但由于某种原因它不包括在内.

sql-server sequences sqlclr clr-hosting

1
推荐指数
1
解决办法
7970
查看次数